我希望标签的所有子元素之间都没有空格。但是BeautifulSoups .contents
和.children
也会返回标记之间的空白。
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>]
有什么办法告诉BeautifulSoup只返回标签而忽略空格吗?
The documentation在此主题上不是很有帮助。示例中的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'
?
重复标记旅的注释:
有许多关于BeautifulSoup和空白的问题。大多数人都在问要摆脱“渲染文本”中的空白。
例如:
BeautifulSoup - getting rid of paragraph whitespace/line breaks
Removing new line '\n' from the output of python BeautifulSoup
两个问题都希望文本没有空格。我想要没有空格的标签。那里的解决方案不适用于我的问题。
另一个例子:
Regular expression for class with whitespaces using Beautifulsoup
这个问题是关于class属性中的空格的。
答案 0 :(得分:0)
BeautifulSoup具有.find_all(True)
,它返回所有标签,但标签之间没有空格:
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
合并,您只会得到直系孩子,而不是孩子的孩子。
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))
打印:
[<span>1</span>, <a href="2.html"><b>2</b></a>, <a href="3.html">3</a>]
琐事:现在有了解决方案,我在StackOverflow中发现了另一个看似无关的问答,解决方案隐藏在注释中:
Why does BeautifulSoup .children contain nameless elements as well as the expected tag(s)