Beautifulsoup兄弟结构与br标签

时间:2013-07-14 11:37:47

标签: python beautifulsoup

我正在尝试使用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>标签,但这似乎并不优雅,因为它需要我更改输入。什么是解决这个问题的更好方法?

3 个答案:

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