BeautifulSoup父标签

por*_*efs 8 python beautifulsoup html-parsing

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

<p>TEXT I WANT <i> &#8211; </i></p>
Run Code Online (Sandbox Code Playgroud)

现在,<p>本文档中有很多标签.因此,find('p')获取我想要提取的文本不是一个好方法.但是,该<i>标记是文档中唯一的标记.所以,我以为我可以找到<i>,然后去找父母.

我试过了:

up = soup.select('p i').parent
Run Code Online (Sandbox Code Playgroud)

up = soup.select('i')
print(up.parent)
Run Code Online (Sandbox Code Playgroud)

我已经有尝试过.parents,我试过find_all('i'),find('i')...但我总是得到:

'list' object has no attribute "parent"
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Mar*_*ers 9

find_all()返回一个列表.find('i')返回第一个匹配元素,或None.

因此,使用:

try:
    up = soup.find('i').parent
except AttributeError:
    # no <i> element
Run Code Online (Sandbox Code Playgroud)

演示:

>>> 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 '
Run Code Online (Sandbox Code Playgroud)


Tot*_*tem 7

这有效:

i_tag = soup.find('i')
my_text = str(i_tag.previousSibling).strip()
Run Code Online (Sandbox Code Playgroud)

输出:

'TEXT I WANT'
Run Code Online (Sandbox Code Playgroud)

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

如果您不确定是否存在i标签,则只需使用一个try/except块即可

  • sooo看起来像(对于bs4)node.find_parent() (2认同)

小智 6

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

>>> [up] = soup.select('i')
>>> print(up.parent)
Run Code Online (Sandbox Code Playgroud)

或者

>>> up = soup.select('i')
>>> print(up[0].parent)
Run Code Online (Sandbox Code Playgroud)


ama*_*enn 5

双方select()find_all()返回您元素的数组。你应该这样做:

for el in soup.select('i'):
    print el.parent.text
Run Code Online (Sandbox Code Playgroud)