【问题标题】:Is this not a suitable scenario for an Html parser?这不适合 Html 解析器吗?
【发布时间】:2011-10-12 02:14:42
【问题描述】:

我必须在 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 标记格式错误,a 标记的href 属性内的someothertag 未被识别为节点(虽然它实际上是属性内的文本,但我希望它被识别为一个标签)。

还有什么我可以用来帮助我解析这样的坏 Html 的东西吗?

【问题讨论】:

  • 恐怕你不能真正解析这样的东西。至少不是以一种总是按照你想要的方式工作的方式。为什么需要解析这样可怕的东西?
  • 我什至想知道谁/什么会产生这样的东西?
  • 这是我需要处理的自定义模板语法。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 2023-03-22
      相关资源
      最近更新 更多