1

我有一个包含以下内容的 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

4 回答 4

4

HTML 无效。你不能有一个<p>内部 a <b>。BeautifulSoup 正在尝试执行错误恢复(浏览器也是如此)。

阻止它的最佳方法是修复 HTML

于 2012-07-06T14:13:31.350 回答
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/

于 2012-07-06T14:44:57.623 回答
0

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

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

于 2012-07-06T14:32:23.210 回答
-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>
于 2012-07-06T14:20:03.243 回答