【发布时间】:2021-10-09 23:35:59
【问题描述】:
我正在尝试解决this issue 的问题,其中用户粘贴了我们必须处理的无效 HTML,格式为 <ol><ul><li>item</li></ul></ol>。我们目前正在使用lxml 进行解析。在合法的 HTML 中,<ol> 不能有 <ul> 的(直接)子代(它必须在 <li> 中),因此 lxml 过早关闭 ol 标记以尝试“修复”HTML,产生<div><ol/><ul><li>item</li></ul>。
用户粘贴的文本也可能是无效的 XML(例如,裸 <br> 标记),因此我们不能将其解析为 XML。
因此,我们既不能将其解析为 HTML 也不能解析为 XML,因为它可能是无效的。
为了使这种无效 HTML 的特定(常见)情况变为有效 HTML,我们可以使用正则表达式将所有 <ul> 标记替换为 <ol> 标记吗?
如果我使用 lxml 解析 <ol><ol><li>item</li></ol></ol>,输出看起来很好(不会过早关闭标签)。
但是,我不想破坏实际的用户键入的文本,我想知道是否存在我没有想到的边缘情况(例如 <pre> 标记或其他一些中的“<ul>”疯狂的东西实际上不是标签,尽管我已经测试过那个特殊情况)。
是的,它会将未编号列表更改为编号列表。我没关系。
是的,我已经阅读了this fun regex answer。
【问题讨论】:
-
出于同样的原因,您不能将
<ol>作为<ol>的直接子代。 -
垃圾进,垃圾出。浏览器在收到无效的 HTML 时会做类似的事情。
-
除非您知道人们会粘贴的所有类型的错误 HTML,否则您将无法以通用、稳健的方式解决此问题。
lxml已经在尽最大努力解决错误,是什么让您认为您的修复会更好? -
为了清楚起见,
<ol><ol><li>item</li></ol></ol>“看起来不错”= 不受影响/嵌套 ol 输出 (??),而<ol><ul><li>item</li></ul></ol>“关闭 ul 之前的第一个 ol”?还是我看错了.. -
无论如何,在某些情况下,直接替换可能会无效改变 HTML - HTML cmets 内部、脚本元素内部、属性值内部。可能有更多的上下文。