如何修复错误嵌套/未关闭的HTML标记?

时间:2008-11-16 04:14:58

标签: python html algorithm xhtml

我需要通过使用正确的嵌套顺序关闭所有打开的标记来清理用户提交的HTML。我一直在寻找一个算法或Python代码来做到这一点但除了PHP等一些半生不熟的实现之外没有找到任何东西。

例如,像

<p>
  <ul>
    <li>Foo

变为

<p>
  <ul>
    <li>Foo</li>
  </ul>
</p>

任何帮助将不胜感激:)

5 个答案:

答案 0 :(得分:28)

使用BeautifulSoup:

from BeautifulSoup import BeautifulSoup
html = "<p><ul><li>Foo"
soup = BeautifulSoup(html)
print soup.prettify()

让你

<p>
 <ul>
  <li>
   Foo
  </li>
 </ul>
</p>

据我所知,你无法控制放&lt; li&gt;&lt; / li&gt;标签与Foo分开。

使用Tidy:

import tidy
html = "<p><ul><li>Foo"
print tidy.parseString(html, show_body_only=True)

让你

<ul>
<li>Foo</li>
</ul>

不幸的是,我知道无法保持&lt; p&gt;示例中的标记。 Tidy将其解释为一个空段而不是一个未闭合段,所以这样做

print tidy.parseString(html, show_body_only=True, drop_empty_paras=False)

出现

<p></p>
<ul>
<li>Foo</li>
</ul>

最终,当然,&lt; p&gt;你的例子中的标签是多余的,所以丢失它可能没问题。

最后,Tidy也可以缩进:

print tidy.parseString(html, show_body_only=True, indent=True)

变为

<ul>
  <li>Foo
  </li>
</ul>

所有这些都有起伏,但希望其中一个足够接近。

答案 1 :(得分:10)

通过Tidy或其中一个移植的libraries运行。

尝试手动编码, 想要掏出你的眼睛。

答案 2 :(得分:4)

使用html5lib,效果很棒! 像这样。

soup = BeautifulSoup(data,'html5lib')

答案 3 :(得分:1)

刚才,我得到了一个hx,其中lxml和pyquery没有正常工作,似乎html中有一些错误。 由于Tidy不容易在Windows中安装,我选择BeautifulSoup。 但我发现:

from BeautifulSoup import BeautifulSoup
import lxml.html
soup = BeautifulSoup(page)
h = lxml.html(soup.prettify())

h = lxml.html(page)

相同

哪个真正解决我的问题是soup = BeautifulSoup(page, 'html5lib') 您应首先安装html5lib,然后将其用作BeautifulSoup中的解析器。 html5lib解析器似乎比其他解析器好得多。

希望这可以帮助某人。

答案 4 :(得分:0)

我尝试使用以下方法,但在 python 3

失败
from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(page, 'html5lib')

我在下面尝试过,并成功

soup = bs4.BeautifulSoup(html, 'html5lib')
f_html = soup.prettify()
print(f'Formatted html::: {f_html}')