BeautifulSoup <b>粗体</b>标签失败

时间:2012-07-06 14:11:33

标签: python html beautifulsoup

我有一个包含以下内容的HTML:

<b>
<p align="left">TXT1</p>
</b>
<p align="left">
<b>NR1</b> 
<b>TXT2</b>
TXT3 
<b>TXT4</b>
TXT5
</p>

当我这样做时:

from BeautifulSoup import BeautifulSoup
html = urllib.urlopen('url')
htmlr = html.read()
soup = BeautifulSoup(htmlr)

print soup

我得到了不同的东西:

<p align="left">TXT1</p>
<p align="left">NR1 <b>TXT2</b> TXT3 <b>TXT4</b>
TXT5</p>

我正在分析html文档布局,因此丢失标签非常令人沮丧。为什么会发生这种情况,最好的办法是什么呢?帮助很多!

编辑:为了提取信息,我需要处理格式错误的html文档。如果他们的创建者想要将某些文本渲染为粗体,我必须考虑它,即使该人创建了无效的HTML。

4 个答案:

答案 0 :(得分:4)

HTML无效。 <p>内不能有<b>。 BeautifulSoup正在尝试执行错误恢复(与浏览器一样)。

阻止它的最佳方法是fix the HTML

答案 1 :(得分:1)

HTML Tidy似乎正确修复了无效的HTML。他们在这里有一个网络实现:http://infohound.net/tidy/

我进入了:

<b><p>hello world</p></b>

得到了这个结果:

<p><b>hello world</b></p>

这里有一个python版本: http://www.egenix.com/products/python/mxExperimental/mxTidy/

答案 2 :(得分:0)

你可以试试html5lib而不是BeautifulSoup。 Html5lib实现了HTML5解析器算法,因此它应该导致生成与现代浏览器相同的DOM。

免责声明:我没有为自己尝试过html5lib解析器,所以我不知道它是当前的稳定性级别。

答案 3 :(得分:-1)

与昆汀建议相同。

如果您希望<p>元素为粗体,请使用内联CSS而不是<b>标记。

<p style='font-weight:bold;' align="left">TXT1</p>
<p align="left">
<b>NR1</b> 
<b>TXT2</b>
TXT3 
<b>TXT4</b>
TXT5
</p>