我正在尝试使用BeautifulSoup Python库解析HTML文档,但结构被<br>
标记扭曲了。我来举个例子。
输入HTML:
<div>
some text <br>
<span> some more text </span> <br>
<span> and more text </span>
</div>
BeautifulSoup解释的HTML:
<div>
some text
<br>
<span> some more text </span>
<br>
<span> and more text </span>
</br>
</br>
</div>
在来源中,跨度可以被认为是兄弟姐妹。在解析之后(使用默认解析器),跨度突然不再是兄弟,因为br标签成为结构的一部分。
我能想到解决这个问题的解决方案是在将html注入Beautifulsoup之前完全剥离<br>
标签,但这似乎并不优雅,因为它需要我更改输入。什么是解决这个问题的更好方法?
答案 0 :(得分:8)
你最好的选择是extract()
换行符。这比你想象的要容易:)。
>>> from bs4 import BeautifulSoup as BS
>>> html = """<div>
... some text <br>
... <span> some more text </span> <br>
... <span> and more text </span>
... </div>"""
>>> soup = BS(html)
>>> for linebreak in soup.find_all('br'):
... linebreak.extract()
...
<br/>
<br/>
>>> print soup.prettify()
<html>
<body>
<div>
some text
<span>
some more text
</span>
<span>
and more text
</span>
</div>
</body>
</html>
答案 1 :(得分:5)
这是一个非常古老的问题,但我遇到了类似的问题,因为我的文档包含了closong user.events.store
标签。因此,beatifulsoup(bs尝试处理结束标记,我认为是)忽略了大量的文档块。</br>
实际上没有找到任何内容,因为没有开放的soup.find_all('br')
标记,所以我无法使用br
方法。
在猛击我的头一小时后,我发现使用extract()
解析器而不是默认的html修复了问题。
lxml
答案 2 :(得分:4)
您也可以这样做:
str(soup).replace("</br>", "")