我需要清理由用户提交的HTML通过关闭任何与正确的嵌套顺序打开的标签。我一直在寻找一种算法或Python代码来做这件事,但除了PHP等的一些半生不熟的实现外,我什么也没找到。
例如,类似这样的内容
<p>
<ul>
<li>Foo
变成了
<p>
<ul>
<li>Foo</li>
</ul>
</p>
如有任何帮助,我们将不胜感激:)
发布于 2008-11-16 06:05:25
使用BeautifulSoup:
from BeautifulSoup import BeautifulSoup
html = "<p><ul><li>Foo"
soup = BeautifulSoup(html)
print soup.prettify()
得到你
<p>
<ul>
<li>
Foo
</li>
</ul>
</p>
据我所知,您无法控制将标记与Foo放在不同的行中。
使用Tidy:
import tidy
html = "<p><ul><li>Foo"
print tidy.parseString(html, show_body_only=True)
得到你
<ul>
<li>Foo</li>
</ul>
不幸的是,我不知道如何在示例中保留标记。Tidy将其解释为一个空段落,而不是一个未结束的段落。
print tidy.parseString(html, show_body_only=True, drop_empty_paras=False)
出来的结果是
<p></p>
<ul>
<li>Foo</li>
</ul>
当然,最终,您的示例中的标记是多余的,因此您可能会忽略它。
最后,Tidy还可以进行缩进:
print tidy.parseString(html, show_body_only=True, indent=True)
变成了
<ul>
<li>Foo
</li>
</ul>
所有这些都有起伏,但希望其中一个足够接近。
发布于 2017-08-23 15:08:13
使用html5lib,工作起来很棒!就像这样。
soup = BeautifulSoup(data,'html5lib')
发布于 2015-09-17 17:38:25
刚才,我得到了一个html,它的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
解析器似乎比其他解析器工作得更好。
希望这能对某些人有所帮助。
https://stackoverflow.com/questions/293482
复制相似问题