Родительский тег 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> – </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)