Родительский тег BeautifulSoup

у меня есть html, из которого я хочу извлечь текст. Вот пример html:

<p>TEXT I WANT <i> – </i></p>

теперь, очевидно, есть много <p> теги в этом документе. Итак,find('p') это не лучший способ получить текст, который я хочу извлечь. Однако, это <i> тег является единственным в документе. Итак, я думал, что смогу просто найти <i>, а затем перейти к родительской.

Я пробовал:

up = soup.select('p i').parent

и

up = soup.select('i')
print(up.parent)

и я попробовал с .parents, Я пробовал find_all('i'), find('i')... Но я всегда получаю:

'list' object has no attribute "parent"

что я делаю не так?

4 ответов


это работает:

i_tag = soup.find('i')
my_text = str(i_tag.previousSibling).strip()

выход:

'TEXT I WANT'

как упоминалось в других ответах,find_all() возвращает список, тогда как find() возвращает первый матч или None

если вы не уверены в наличии тега i, вы можете просто использовать try/except блок


find_all() возвращает список. find('i') возвращает первый соответствующий элемент или None.

таким образом, использовать:

try:
    up = soup.find('i').parent
except AttributeError:
    # no <i> element

демо:

>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('<p>TEXT I WANT <i> &#8211; </i></p>')
>>> soup.find('i').parent
<p>TEXT I WANT <i> – </i></p>
>>> soup.find('i').parent.text
u'TEXT I WANT  \u2013 '

и select() и find_all() возвращает вам массив элементов. Вы должны сделать как следовать:

for el in soup.select('i'):
    print el.parent.text

soup.select() возвращает список Python. Так что вы имеете unlist' переменной например:

>>> [up] = soup.select('i')
>>> print(up.parent)

или

>>> up = soup.select('i')
>>> print(up[0].parent)