Grense dybde av tag.text

stemmer
0

Jeg kan bare ikke få det riktig. BeautifulSoup4 er så forvirrende.

Jeg prøver å fikse unrendered Markdown referanser i HTML tekst. Regex er:

REF = re.compile(r\[(?P<title>.+?)\]\[(?P<identifier>.*?)\])

Siden tilsynelatende BS4 bruksområder matchmed regulære uttrykk, jeg gjorde regex bredere med

REF = re.compile(r.*\[(?P<title>.+?)\]\[(?P<identifier>.*?)\].*, re.DOTALL)

Målet er å finne slike strenger og erstatte dem med faktiske <a>koblinger, men ikke hvis de er i en <code>tag (uansett dybde). Jeg har en kartlegging for å få nettadressen fra identifier.

[<code>title<code>][identifier]bør matches, men <code>[title][identifier]</code>bør ikke.

Hvis inngangen er:

<p>[<code>title<code>][identifier]</p>

Utgangen skal være:

<p><a id=identifier href=http://example.com><code>title<code></a></p>

Men følgende innspill bør være uberørt:

<p><code>[title][identifier]</code></p>

Jeg prøvde følgende:

tags = [tag.parent for tag in soup.find_all(text=REF) if not tag.find_parent(code)]

... men det var mangler koder. Jeg fant en forklaring på dette innlegget: BeautifulSoup - søk etter tekst i en tag . Det virker text(eller det nye navnet string, men jeg fant atferden å være annerledes) vil returnere Nonenår det er andre koder i koden, noe som betyr at koden <p>[<code>title<code>][identifier]</p>vil ikke bli matchet.

Jeg trodde også etter ga løsningen:

tags = list(
    soup.find_all(
        lambda tag: tag.name != code and
                    not tag.find_parent(code) and
                    REF.search(tag.text)
    )
)

... men nå i stedet for å gi meg tags nær bladene, returnerer rot koder som <html>og <body>, fordi tag.textreturnerer full, rekursiv tekst av alle etterkommere . Så selvfølgelig disse kodene inneholder tekst som passer til regex, men inne <code>tags .

Den beste løsningen, tror jeg, ville være å prøve regex mot tag tekst begrenset til en viss dybde. Dersom dybde en tekst av <p>[<code>title</code>][identifier]</p>er [ ][identifier]og dybde-2 tekst av den samme koden er [<code>title</code>][identifier], da dybde-2 er alle jeg behov.

Er det en måte å gjøre det? Eller har du noen annen løsning i tankene? Jeg tenkte kanskje jeg kunne iterere på alle kodene fra bladene til roten, bredde-først, men jeg vil fortsatt ha det samme problemet med tag.textå returnere alle etterkommere tekst også.

Publisert på 19/03/2020 klokken 22:00
kilden bruker
På andre språk...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more