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