Frage

Ich versuche, die Elemente in einem HTML-Dokument zu erhalten, die das folgende Muster von Text enthalten: # \ S {11}

<h2> this is cool #12345678901 </h2>

So würde passen die vorherige durch die Verwendung:

soup('h2',text=re.compile(r' #\S{11}'))

Und die Ergebnisse würden wie etwas sein:

[u'blahblah #223409823523', u'thisisinteresting #293845023984']

Ich bin in der Lage den gesamten Text zu erhalten, die übereinstimmt (siehe Zeile oben). Aber ich will das übergeordnete Element des Textes entsprechen, so kann ich, dass zum Verfahren des Dokumentenbaumes als Ausgangspunkt verwenden. In diesem Fall, kehre ich alle h2-Elemente wollen würde zu, nicht den Text übereinstimmt.

Ideen?

War es hilfreich?

Lösung

from BeautifulSoup import BeautifulSoup
import re

html_text = """
<h2>this is cool #12345678901</h2>
<h2>this is nothing</h2>
<h1>foo #126666678901</h1>
<h2>this is interesting #126666678901</h2>
<h2>this is blah #124445678901</h2>
"""

soup = BeautifulSoup(html_text)


for elem in soup(text=re.compile(r' #\S{11}')):
    print elem.parent

Prints:

<h2>this is cool #12345678901</h2>
<h2>this is interesting #126666678901</h2>
<h2>this is blah #124445678901</h2>

Andere Tipps

Mit BS4 (Schöner Suppe 4), der Versuch des OP funktioniert genau wie erwartet:

from bs4 import BeautifulSoup
soup = BeautifulSoup("<h2> this is cool #12345678901 </h2>")
soup('h2',text=re.compile(r' #\S{11}'))

kehrt [<h2> this is cool #12345678901 </h2>].

scroll top