BeautifulSoup .children或.content,标记之间没有空格

时间:2019-05-07 11:14:15

标签: python beautifulsoup

我希望标签的所有子元素之间都没有空格。但是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属性中的空格的。

1 个答案:

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