仅提取此元素的文本,而非其子元素

96 投票
5 回答
87922 浏览
提问于 2025-04-16 11:48

我想从我的“汤”(指的是一个包含HTML内容的对象)中提取最上面的元素的文本;但是用soup.text会得到所有子元素的文本:

我有

import BeautifulSoup
soup=BeautifulSoup.BeautifulSoup('<html>yes<b>no</b></html>')
print soup.text

这个的输出是 yesno。我只想要'yes'。

有什么好的方法可以做到这一点吗?

编辑:我还希望在解析 '<html><b>no</b>yes</html>' 时也能输出 yes

5 个回答

42

你可以使用 contents 来获取内容。

>>> print soup.html.contents[0]
yes

或者,如果你想获取网页下的所有文本,可以使用 findAll(text=True, recursive=False)

>>> soup = BeautifulSoup.BeautifulSOAP('<html>x<b>no</b>yes</html>')
>>> soup.html.findAll(text=True, recursive=False) 
[u'x', u'yes']

上面的内容会合并成一个字符串。

>>> ''.join(soup.html.findAll(text=True, recursive=False)) 
u'xyes'
94

.find(text=True)呢?

>>> BeautifulSoup.BeautifulSOAP('<html>yes<b>no</b></html>').find(text=True)
u'yes'
>>> BeautifulSoup.BeautifulSOAP('<html><b>no</b>yes</html>').find(text=True)
u'no'

补充:

我觉得我现在明白你想要什么了。试试这个:

>>> BeautifulSoup.BeautifulSOAP('<html><b>no</b>yes</html>').html.find(text=True, recursive=False)
u'yes'
>>> BeautifulSoup.BeautifulSOAP('<html>yes<b>no</b></html>').html.find(text=True, recursive=False)
u'yes'
6

在现代的(截至2023年6月17日)BeautifulSoup4中,给定:

from bs4 import BeautifulSoup
node = BeautifulSoup("""
<html>
    <div>
        <span>A</span>
        B
        <span>C</span>
        D
    </div>
</html>""").find('div')

使用下面的代码可以获取直接子元素的文本内容(BD):

s = "".join(node.find_all(string=True, recursive=False))

而使用以下代码可以获取所有后代元素的文本内容(ABCD):

s = "".join(node.find_all(string=True, recursive=True))

撰写回答