由于各种原因超出了本问题的范围,我使用的是用python编写的adhoc html解析类。到目前为止,这个简单的类已足以满足它所输入的输入类型,但它最近试图解析http://forum.macbidouille.com/index.php?showtopic=160607
这个网页显然是由一些php代码自动生成的,但它包含用户生成的html,这些html逐字包含在每个帖子的签名中。最值得注意的是,http://forum.macbidouille.com/index.php?showtopic=160607#entry1563022包含以下HTML(为了清晰起见,删除了注释并缩进了标记):
<div class="signature">
<span style="font-family:Verdana">
<span style="color:#8B0000">
<span style="font-size:12pt;line-height:100%">
<div align='center'>La Culture coûte cher, mais l'inculture coûte encore plus cher à la Société. <br />
<span style="font-size:8pt;line-height:100%"><i>Marcel Landowsky</i></span>
</span><br />
</div>
</span>
</span>
<div align='left'><br />macbook unibody 10.6.8 - 2.26ghz - 4Go- 250Go - <br />Je n'ai pas de télévision !</div>
</div>
从上面可以明显看出,有一个过早关闭的迷路标签。即,我们这里有无效的HTML。没什么特别的,但这足以让我的解析代码失败。具体来说,到目前为止,解析代码有一个非常简单的错误处理策略:它只是尝试将每个结束标记与当前打开的标记匹配,如果结束标记不匹配,则忽略它。
对于上面的代码,这导致忽略第7行,因为它与第5行的当前打开的标记不匹配,然后忽略最后一行,因为它与第2行上当前打开的标记不匹配。结果是,假设该块后面的所有html都被层次化地包含在第一个标签中,这导致了其他问题。
我想要实现的是更好地“同步”解析状态,我想知道什么样的简单方法会导致解析器能够处理这个html块。我可以看到,一旦通过重新排列生成的树完成解析,我可以尝试最小化丢弃的结束标记的数量,但我正在寻找一个更简单的解决方案。
我知道第一个答案是:“使用库X”,这可能是我最终要做的事情,但我真的很好奇是什么样的有趣的解析和错误处理策略可以用于此案件。即,我正在努力接受教育:)
谢谢!
答案 0 :(得分:0)
您最好的办法是首先尝试解析(并修复)用户提供的HTML,否则您最终可能会遇到各种原始DOM结构损坏。首先,我想,你应该检查用户HTML的标签嵌套并清理它(即</span>
没有相应的开始标记,所以应该删除它)。如果您有一个只有HTML的解析器,请在解析之前将用户HTML括在<div>..</div>
中 - 这应该可以解决问题。