Использование BeautifulSoup для поиска HTML-тега, содержащего определенный текст
Я пытаюсь получить элементы в HTML-документе, которые содержат следующий шаблон текста: #S{11}
<h2> this is cool #12345678901 </h2>
Так, предыдущий будет соответствовать с помощью:
soup('h2',text=re.compile(r' #S{11}'))
и результаты будут что-то вроде:
[u'blahblah #223409823523', u'thisisinteresting #293845023984']
Я могу получить весь текст, который соответствует (см. строку выше). Но я хочу, чтобы родительский элемент текста соответствовал, поэтому я могу использовать его в качестве отправной точки для обхода дерева документов. В этом случае я бы хотел, чтобы все элементы h2 чтобы вернуться, не соответствует тексту.
идеи?
3 ответа:
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
принты:
<h2>this is cool #12345678901</h2> <h2>this is interesting #126666678901</h2> <h2>this is blah #124445678901</h2>
BeautifulSoup поисковые операции доставить [список]
BeautifulSoup.NavigableString
объекты, когдаtext=
используется в качестве критерия в противоположностьBeautifulSoup.Tag
в других случаях. Проверьте объект__dict__
чтобы увидеть атрибуты, доступные для вас. Из этих атрибутов,parent
продвиженияprevious
из-за изменения в BS4.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