Limiet diepte van tag.text

stemmen
0

Ik kan het gewoon niet goed te krijgen. BeautifulSoup4 is zo verwarrend.

Ik ben op zoek naar gerenderde Markdown referenties in HTML-tekst op te lossen. De reguliere expressie is:

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

Aangezien blijkbaar BS4 toepassingen matchmet reguliere expressies, maakte ik de reguliere expressie breder met

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

Het doel is om dergelijke snaren te vinden en te vervangen met de werkelijke <a>banden, maar niet als ze zich in een <code>tag (ongeacht de diepte). Ik heb een mapping naar de URL te krijgen van het identifier.

[<code>title<code>][identifier]moeten worden afgestemd, maar <code>[title][identifier]</code>moet niet.

Als de ingang:

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

De output zou moeten zijn:

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

Echter, de volgende ingang moet onaangeroerd blijven:

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

Ik probeerde het volgende:

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

... maar het ontbrak-tags. Ik vond een verklaring in dit bericht: BeautifulSoup - zoeken op tekst in een tag . Het lijkt erop dat text(of de nieuwe naam string, hoewel ik het gedrag anders te zijn gevonden) zal terugkeren Noneals er andere tags in het label, wat betekent dat het label <p>[<code>title<code>][identifier]</p>niet zal worden geëvenaard.

Ik vond ook de paal gaf de oplossing:

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

... maar nu in plaats van het geven van me labels in de buurt van de bladeren, keert het root-tags zoals <html>en <body>, omdat tag.texthet rendement van de volledige, recursieve tekst van alle nakomelingen . Dan natuurlijk deze tags tekst bevat die overeenkomen met de reguliere expressie, maar binnen <code>labels .

De beste oplossing, denk ik, zou zijn om de reguliere expressie tegen de tekst van de tag is beperkt tot een bepaalde diepte te proberen. Als diepte-1 tekst van <p>[<code>title</code>][identifier]</p>is [ ][identifier]en diepte-2 tekst van dezelfde tag is [<code>title</code>][identifier], dan is de diepte-2 is alles wat ik nodig heb.

Is er een manier om dat te doen? Of heb je een andere oplossing in gedachten? Ik dacht misschien kan ik herhalen op alle labels van de bladeren aan de wortel, breedte-first, maar ik zal nog steeds hetzelfde probleem met tag.textde tekst alle afstammelingen terug te keren als goed.

De vraag is gesteld op 19/03/2020 om 22:00
bron van user
In andere talen...                            

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