BeautifulSoup父标签

时间:2014-02-25 19:17:13

标签: python html-parsing beautifulsoup

我有一些html,我想从中提取文本。这是html的一个例子:

<p>TEXT I WANT <i> &#8211; </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 个答案:

答案 0 :(得分:8)

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 '

答案 1 :(得分:7)

这有效:

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

<强>输出:

'TEXT I WANT'

如其他答案中所述,find_all()会返回一个列表,而find()会返回第一个匹配或None

如果您不确定是否存在i标记,则只需使用try/except

答案 2 :(得分:2)

select()find_all()都会返回一个元素数组。你应该这样做:

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

答案 3 :(得分:0)

soup.select()返回一个Python列表。因此,您可以“取消列出”变量 例如:

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

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