Python中BeautifulSoup.contents的使用问题请教
>>> soup = BeautifulSoup("Foo")
>>> soup.a.append("Bar")
>>> soup
FooBar
>>> soup.a.contents
[u’Foo’, u’Bar’]
上面代码执行后,soup.a.contents 列表中有两项内容,但是下面代码执行后,列表中却只有一项内容,为何会有这个差别?感谢指点!
>>> soup = BeautifulSoup(“FooBar”)
>>> soup
FooBar
>>> soup.a.contents
[‘FooBar’]
Python中BeautifulSoup.contents的使用问题请教
4 回复
最后结果都是 list,第一个长度为 2,第二个长度为 1。这是列表的,不是 bs4 的。
帖子回复:
BeautifulSoup.contents 返回一个列表,包含一个标签的直接子节点(包括字符串、注释、其他标签等)。常见问题通常是混淆了 .contents 和 .children(后者是生成器),或者没处理好子节点中的空白字符(如换行符 \n)。
核心要点:
.contents返回列表:可以直接索引或遍历。- 子节点包含文本节点:HTML中的换行和空格都可能成为子节点,导致索引与预期不符。
- 与
.children的区别:.children返回生成器,内存效率更高;.contents直接生成列表,方便随机访问。
示例代码:
from bs4 import BeautifulSoup
html = """
<div>
<p>第一段</p>
<p>第二段</p>
</div>
"""
soup = BeautifulSoup(html, 'html.parser')
div_tag = soup.div
# 获取直接子节点列表
print("子节点列表:", div_tag.contents)
# 输出: ['\n', <p>第一段</p>, '\n', <p>第二段</p>, '\n']
# 访问特定子节点(注意空白字符占位)
print("第一个子节点(可能是换行符):", repr(div_tag.contents[0]))
print("第二个子节点(第一个<p>标签):", div_tag.contents[1])
# 仅获取标签子节点(过滤文本节点)
tag_children = [child for child in div_tag.contents if child.name]
print("仅标签子节点:", tag_children)
常见问题处理:
- 若需要忽略空白字符,可用
if child.strip()或if child.name过滤。 - 若只需第一个有效子标签,可结合
.find()使用。
一句话总结: 注意 .contents 列表中的空白文本节点,按需过滤即可。
第一行应该写成==> soup=BeautifulSoup(“Foo”, ‘lxml’) 吧
是 BeautifulSoup(“Foo”, ‘lxml’),我漏写了

