使用c#解析html字符串时处理html特殊字符

时间:2013-09-14 09:09:35

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

我正在使用htmlagility包来解析html字符串,并将某些模式转换为链接。

给出一个html字符串和一个模式“mystring”。我必须用<a href="/mystring.html>mystring</a>替换hrml字符串中此模式的出现。但有两个例外

1.如果模式已经在锚标记内,我不应该替换模式,这意味着它的直接父级或任何级别父级不应该是锚标记。例如:<a href="google.com><span>mystring</span><\a>
2.它不应该在href里面。对于前<a href="mystring">

  • 输入字符串:"<li><span>mystring test</span></li><li><a href='#'><span>mystring</span></li</li>"
  • 预期输出:"<li><span><a href="/mystring.html>mystring</a> test</span></li><li><a href='#'><span>mystring</span></li</li>"

我正在使用htmlagilitypack并将此字符串作为html doc加载并获取所有文本并查看其任何级别父级是否不是锚并替换它。一切都很简单。但这里有一个问题。

如果我的输入字符串类似于"li><span>mystring test < 10 and 5</span></li>",则会出现问题。 Htmlagility解析器将小于符号视为html特殊字符,并将“&lt; 10和5”视为html标记,并生成类似这样的内容。

&LT; 10 =“”和=“”5 =“”&gt; (具有空值的属性)。

使用htmlagilityparser是否有解决方法? 我应退后一步并使用正则表达式吗?在那种情况下,我如何处理任何级别的锚点异常? 这个问题有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

在HTML标记外使用<无效。请改用&lt;实体。

编辑:如果无法控制输入字符串,您可以尝试替换&#34;&lt; &#34;:

inputhtml = inputhtml.Replace("< ", "&lt; ");

如果还有其他错误,您可以尝试导入MSHTML COM DLL。参考COM dll&#34; Microsoft HTML对象库&#34;。

答案 1 :(得分:0)

两个建议:

  1. 您可以预先清理损坏的HTML,以便HtmlAgilityPack更好地运行。这可能更容易。

  2. 或解析&amp;通过一个简单的基于正则表达式的解析器自己跟踪标签的嵌套结构。但是许多HTML标签不必在规范上结束,例如<TR> <TD> <P> <BR> ..并且你将不得不处理损坏的&lt;这里也有角括号。

  3. 选项2)并不难 - 但首先会有更多的工作,以获得更高的可靠性和收益。控制如何处理来自低质量来源的“格式错误”输入。