【问题标题】:BeautifulSoup <b>bold</b> tag failBeautifulSoup <b>bold</b> 标签失败
【发布时间】:2012-07-06 22:44:57
【问题描述】:

我有一个 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。

【问题讨论】:

    标签: python html beautifulsoup


    【解决方案1】:

    HTML 无效。 &lt;b&gt; 内不能有 &lt;p&gt;。 BeautifulSoup 正在尝试执行错误恢复(浏览器也是如此)。

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

    【讨论】:

    • @root — 您的浏览器正在以与 BeautifulSoup 不同的方式从错误中恢复。修复 HTML。
    【解决方案2】:

    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/

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 您还可以使用 Beautiful Soup 4,它允许您使用 html5lib 解析文档,然后在生成的数据结构上使用 Beautiful Soup API。
      【解决方案4】:

      与昆汀建议的相同。

      如果您希望 &lt;p&gt; 元素加粗,请使用内联 CSS 而不是 &lt;b&gt; 标记。

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

      【讨论】:

      • 我不是在创建这些文档。我需要从中读取结构化文本!
      猜你喜欢
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 2012-05-05
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      相关资源
      最近更新 更多