如何在Python中使用BeautifulSoup提取标记内的文本?

时间:2017-07-01 06:55:48

标签: python beautifulsoup

假设我有一个像这样的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)

2 个答案:

答案 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