Grenztiefe von tag.text

stimmen
0

Ich kann es einfach nicht richtig. BeautifulSoup4 ist so verwirrend.

Ich versuche, nicht gerenderte Abschriften Referenzen in HTML-Text zu beheben. Die Regex ist:

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

Da anscheinend BS4 Anwendungen matchmit regulären Ausdrücken, machte ich die Regex weiter mit

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

Das Ziel ist , solche Strings und ersetzen sie durch tatsächliche zu finden <a>Links, aber nicht , wenn sie in einen sind <code>Tag (unabhängig von der Tiefe). Ich habe eine Zuordnung die URL von der zu bekommen identifier.

[<code>title<code>][identifier]werden sollte abgestimmt, aber <code>[title][identifier]</code>nicht sollte.

Wenn die Eingabe:

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

Die Ausgabe sollte sein:

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

Jedoch ist die folgende Eingabe sollte bleiben unberührt:

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

Ich habe versucht, die folgenden:

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

... aber es fehlt Tags. Ich fand eine Erklärung in diesem Beitrag: BeautifulSoup - von Text innerhalb eines Tags suchen . Es scheint text(oder der neue Name string, obwohl ich das Verhalten anders sein gefunden) zurückkehren , Nonewenn es andere Tags in dem Tag, der Tag bedeutet <p>[<code>title<code>][identifier]</p>nicht angepasst werden.

Ich dachte auch, die Post, die Lösung gab:

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

... aber jetzt anstatt mich geben Tags der Nähe der Blätter, gibt es root - Tags wie <html>und <body>, da tag.textkehrt die volle, rekursive Text aller Nachkommen . Dann natürlich diese Tags enthält Text , um den regulären Ausdruck übereinstimmt, aber innen <code>Tags .

Die beste Lösung, glaube ich, wäre den Regex gegen die Tag-Text zu einer bestimmten Tiefe begrenzt , um zu versuchen. Wenn Tiefe-1 Text <p>[<code>title</code>][identifier]</p>ist [ ][identifier]und Tiefe-2 Text des gleichen Tages ist [<code>title</code>][identifier], dann Tiefe-2 ist alles was ich brauche.

Gibt es eine Möglichkeit , das zu tun? Oder haben Sie eine andere Lösung im Sinne? Ich dachte , vielleicht ich auf all Tags aus den Blättern in die Wurzel, die Breite beginnlaufen könnte, aber ich werde immer noch das gleiche Problem mit tag.textals auch alle Nachkommen Text zurück.

Veröffentlicht am 19/03/2020 um 22:00
quelle vom benutzer
In anderen Sprachen...                            

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