首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何修复错误的嵌套/未闭合的HTML标记?

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

Stack Overflow用户
提问于 2008-11-16 04:14:58
回答 3查看 13.7K关注 0票数 21

我需要清理由用户提交的HTML通过关闭任何与正确的嵌套顺序打开的标签。我一直在寻找一种算法或Python代码来做这件事,但除了PHP等的一些半生不熟的实现外,我什么也没找到。

例如,类似这样的内容

代码语言:javascript
复制
<p>
  <ul>
    <li>Foo

变成了

代码语言:javascript
复制
<p>
  <ul>
    <li>Foo</li>
  </ul>
</p>

如有任何帮助,我们将不胜感激:)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-11-16 06:05:25

使用BeautifulSoup:

代码语言:javascript
复制
from BeautifulSoup import BeautifulSoup
html = "<p><ul><li>Foo"
soup = BeautifulSoup(html)
print soup.prettify()

得到你

代码语言:javascript
复制
<p>
 <ul>
  <li>
   Foo
  </li>
 </ul>
</p>

据我所知,您无法控制将标记与Foo放在不同的行中。

使用Tidy:

代码语言:javascript
复制
import tidy
html = "<p><ul><li>Foo"
print tidy.parseString(html, show_body_only=True)

得到你

代码语言:javascript
复制
<ul>
<li>Foo</li>
</ul>

不幸的是,我不知道如何在示例中保留标记。Tidy将其解释为一个空段落,而不是一个未结束的段落。

代码语言:javascript
复制
print tidy.parseString(html, show_body_only=True, drop_empty_paras=False)

出来的结果是

代码语言:javascript
复制
<p></p>
<ul>
<li>Foo</li>
</ul>

当然,最终,您的示例中的标记是多余的,因此您可能会忽略它。

最后,Tidy还可以进行缩进:

代码语言:javascript
复制
print tidy.parseString(html, show_body_only=True, indent=True)

变成了

代码语言:javascript
复制
<ul>
  <li>Foo
  </li>
</ul>

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

票数 32
EN

Stack Overflow用户

发布于 2017-08-23 15:08:13

使用html5lib,工作起来很棒!就像这样。

soup = BeautifulSoup(data,'html5lib')

票数 7
EN

Stack Overflow用户

发布于 2015-09-17 17:38:25

刚才,我得到了一个html,它的lxml和pyquery不能很好地工作,似乎在html中有一些错误。由于Tidy不容易安装在windows上,所以我选择了BeautifulSoup。但我发现:

代码语言:javascript
复制
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解析器似乎比其他解析器工作得更好。

希望这能对某些人有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/293482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档