这不是Html解析器的合适场景吗?

时间:2011-07-24 16:29:12

标签: c# html-parsing html-agility-pack

我必须在Html属性中处理格式错误的Html和Html标签:

<p class="<sometag attr="something"></sometag>">   
    <a href="<someothertag></someothertag">Link</a>
</p>

我尝试使用HtmlAgilityPack解析内容,但是当您将上述代码加载到HtmlDocument中时,OuterHtml输出:

<p class="<sometag attr=" something"="">">
    <a href="<someothertag></someothertag">Link</a>
</p>

p标记格式不正确,someothertag标记的href属性中的a未被识别为节点(尽管它实际上是属性中的文本,我希望它被认为是一个标签。)

还有什么我可以帮助我解析这样糟糕的Html吗?

2 个答案:

答案 0 :(得分:2)

它不是有效的HTML,所以我认为你不能依靠html解析器来解析它。

答案 1 :(得分:1)

你可能会问很多解析器,因为这可能是一种罕见的情况。您可能需要自己解决此问题。

我看到的主要问题是属性值中有多组双引号。是否保证标记始终具有匹配的每个开口的结束字符?换句话说,对于每个&lt; ,都会有&gt; ,并且对于每个开头',匹配的结束标记?

如果是这种情况,我的建议是获取HTML解析器(如Html Agility Pack)的源代码,并为属性解析添加一些功能。使用堆栈;对于每个开场角色,按下它,然后阅读,直到找到另一个开场或结束角色。如果它打开,推它,如果它关闭,弹出它。

或者,您可以在属性值中添加小于和大于字符的检测,并且在关闭所有包含的标记之前不识别属性值的结尾。

另一种可能的解决方案是在将源标记传递给解析器并将属性值中的非法字符更改为转义字符(ampersand-semicolon)之前修改源标记。不幸的是,这需要您做一些初步解析。