我希望所有标签的孩子都没有标签之间的空格。但是BeautifulSoups .contents
和.children
也返回标签之间的空格。
from bs4 import BeautifulSoup
html = """
<div id="list">
<span>1</span>
<a href="2.html">2</a>
<a href="3.html">3</a>
</div>
"""
soup = BeautifulSoup(html, 'html.parser')
print(soup.find(id='list').contents)
此打印:
['n', <span>1</span>, 'n', <a href="2.html">2</a>, 'n', <a href="3.html">3</a>, 'n']
与
相同print(list(soup.find(id='list').children))
我想要的:
[<span>1</span>, <a href="2.html">2</a>, <a href="3.html">3</a>]
有什么办法告诉美丽的小组仅返回标签并忽略空格?
文档对此主题不是很有帮助。示例中的HTML不包含标签之间的任何空格。
确实剥夺了标签之间所有空格的HTML解决我的问题:
html = """<div id="list"><span>1</span><a href="2.html">2</a><a href="3.html">3</a></div>"""
使用此html我在标签之间获得没有空格的标签,因为标签之间没有空格。但是我希望使用Beautifoulsoup,这样我就不必在HTML源代码中弄乱。我希望Beautifulsoup为我做到这一点。
另一个解决方法可能是:
print(list(filter(lambda t: t != 'n', soup.find(id='list').contents)))
,但这似乎是片状。是否保证始终是'n'
?
重复标记旅的注释:
有很多问题询问有关美丽的人和空格。大多数人都在询问从"渲染文本"中摆脱空格。
例如:
美丽的套件 - 摆脱段落/空白段/线路休息
从Python Beautifulsoup的输出中删除新线' n'
两个问题都需要文本而没有空格。我想要没有空格的标签。那里的解决方案不适用于我的问题。
另一个示例:
使用Beautifulsoup
与whitespace的类正则表达式这个问题是关于类属性中的空格。
beautifulsoup具有.find_all(True)
,它返回所有标签,而没有标签之间的空格:
from bs4 import BeautifulSoup
html = """
<div id="list">
<span>1</span>
<a href="2.html">2</a>
<a href="3.html">3</a>
</div>
"""
soup = BeautifulSoup(html, 'html.parser')
print(soup.find(id='list').find_all(True))
打印:
[<span>1</span>, <a href="2.html">2</a>, <a href="3.html">3</a>]
与recursive=False
结合,您只会得到直接的孩子而不是孩子的孩子。
证明我将<b>
添加到第二个孩子中。那将是一个孙子。
from bs4 import BeautifulSoup
html = """
<div id="list">
<span>1</span>
<a href="2.html"><b>2</b></a>
<a href="3.html">3</a>
</div>
"""
soup = BeautifulSoup(html, 'html.parser')
print(soup.find(id='list').find_all(True, recursive=False))
使用recursive=False
打印:
[<span>1</span>, <a href="2.html"><b>2</b></a>, <a href="3.html">3</a>]
使用recursive=True
打印:
[<span>1</span>, <a href="2.html"><b>2</b></a>, <b>2</b>, <a href="3.html">3</a>]
Trivia:现在我有了解决方案,我在stackoverflow中找到了另一个看似无关的问题,并在评论中隐藏了解决方案:
为什么美丽的小伙子包含无名元素以及预期的标签