假设我有一个像这样的html字符串:
<html>
<div id="d1">
Text 1
</div>
<div id="d2">
Text 2
<a href="http://my.url/">a url</a>
Text 2 continue
</div>
<div id="d3">
Text 3
</div>
</html>
我想提取其他代码包含的 NOT d2
的内容,跳过a url
。换句话说,我想得到这样的结果:
Text 2
Text 2 continue
有没有办法用BeautifulSoup做到这一点?
我试过了,但这不正确:
soup = BeautifulSoup(html_doc, 'html.parser')
s = soup.find(id='d2').text
print(s)
答案 0 :(得分:6)
尝试.find_all(text=True, recursive=False)
:
from bs4 import BeautifulSoup
div_test="""
<html>
<div id="d1">
Text 1
</div>
<div id="d2">
Text 2
<a href="http://my.url/">a url</a>
Text 2 continue
</div>
<div id="d3">
Text 3
</div>
</html>
"""
soup = BeautifulSoup(div_test, 'lxml')
s = soup.find(id='d2').find_all(text=True, recursive=False)
print(s)
print([e.strip() for e in s]) #remove space
它将返回仅list
的{{1}}:
text
答案 1 :(得分:1)
您只能通过简单的列表推导获得NavigableString
个对象。
tag = soup.find(id='d2')
s = ''.join(e for e in tag if type(e) is bs4.element.NavigableString)
或者,您可以使用decompose
方法删除所有子节点,然后使用text
获取所有剩余项目。
tag = soup.find(id='d2')
for e in tag.find_all() :
e.decompose()
s = tag.text