Ich versuche, die Elemente in einem HTML-Dokument abzurufen, die das folgende Textmuster enthalten: # \ S {11}
<h2> this is cool #12345678901 </h2>
Das vorherige würde also übereinstimmen, indem es Folgendes verwendet:
soup('h2',text=re.compile(r' #\S{11}'))
Und die Ergebnisse wären ungefähr so:
[u'blahblah #223409823523', u'thisisinteresting #293845023984']
Ich kann den gesamten passenden Text abrufen (siehe Zeile oben). Ich möchte jedoch, dass das übergeordnete Element des Textes übereinstimmt, damit ich es als Ausgangspunkt für das Durchlaufen des Dokumentbaums verwenden kann. In diesem Fall möchte ich, dass alle h2-Elemente zurückgegeben werden und nicht der Text übereinstimmt.
Ideen?
python
regex
beautifulsoup
html-content-extraction
Sotangochips
quelle
quelle
text
(oderstring
die sie ersetzt) keine anderen Einschränkungen ignoriertAntworten:
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
Drucke:
<h2>this is cool #12345678901</h2> <h2>this is interesting #126666678901</h2> <h2>this is blah #124445678901</h2>
quelle
.parent
war großartig! Ich habe niemals darüber nachgedacht. Danke @nosklo. +1.parent
. Musste PyCharms Debugger verwenden, um zu erkennen, dass es sich nicht um eine einfache Zeichenfolge handelt.BeautifulSoup-Suchvorgänge liefern [eine Liste von]
BeautifulSoup.NavigableString
Objekten, wenntext=
sie als Kriterium verwendet werden, im Gegensatz zuBeautifulSoup.Tag
anderen Fällen. Überprüfen Sie die Objekte__dict__
, um die Ihnen zur Verfügung gestellten Attribute anzuzeigen. Von diesen Attributenparent
wirdprevious
aufgrund von Änderungen in BS4 bevorzugt .from BeautifulSoup import BeautifulSoup from pprint import pprint import re html_text = """ <h2>this is cool #12345678901</h2> <h2>this is nothing</h2> <h2>this is interesting #126666678901</h2> <h2>this is blah #124445678901</h2> """ soup = BeautifulSoup(html_text) # Even though the OP was not looking for 'cool', it's more understandable to work with item zero. pattern = re.compile(r'cool') pprint(soup.find(text=pattern).__dict__) #>> {'next': u'\n', #>> 'nextSibling': None, #>> 'parent': <h2>this is cool #12345678901</h2>, #>> 'previous': <h2>this is cool #12345678901</h2>, #>> 'previousSibling': None} print soup.find('h2') #>> <h2>this is cool #12345678901</h2> print soup.find('h2', text=pattern) #>> this is cool #12345678901 print soup.find('h2', text=pattern).parent #>> <h2>this is cool #12345678901</h2> print soup.find('h2', text=pattern) == soup.find('h2') #>> False print soup.find('h2', text=pattern) == soup.find('h2').text #>> True print soup.find('h2', text=pattern).parent == soup.find('h2') #>> True
quelle
soup.find('h2', text=pattern)
gibt das Tag direkt, keine Notwendigkeit anzurufen.parent
. In der Dokumentation heißt es auch, dass Sie den Parameterstring
(text
in früheren Versionen) mit Argumenten kombinieren können, die Tags finden. In diesem Fall wird BeautifulSoup das TagMit bs4 (Beautiful Soup 4) funktioniert der Versuch des OP genau wie erwartet:
from bs4 import BeautifulSoup soup = BeautifulSoup("<h2> this is cool #12345678901 </h2>") soup('h2',text=re.compile(r' #\S{11}'))
kehrt zurück
[<h2> this is cool #12345678901 </h2>]
.quelle