我有一些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"
我做错了什么?
答案 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> – </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)