一尘不染

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

algorithm

我需要通过关闭所有具有正确嵌套顺序的打开标签来清理用户提交的HTML。我一直在寻找一种算法或Python代码来执行此操作,但除了PHP中的一些半熟实现之外,没有发现任何东西。

例如,类似

<p>
  <ul>
    <li>Foo

变成

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

任何帮助,将不胜感激 :)


阅读 296

收藏
2020-07-28

共1个答案

一尘不染

使用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>
    

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

    2020-07-28