htmlagilitypack识别不一致

时间:2011-03-23 10:14:59

标签: xpath html-agility-pack

我使用htmlagilitypack& xpath的。

如何识别html中的insconsistancy。例如:

<table><tr><td>
<b>Car1</b><span>Color123</span>
<bCar2</b><span>Color333</span>
<b>Car3</b><span>Color221</span>
<b>Car4 <span>Color224</span>
<b>Car5</b><span>Color621</span>
</table></tr></td>

Car2&amp; Car4大胆破了。

问题是我使用root.SelectNodes(“// b [1]”)[索引]并且它错过索引位置2(Car2)并将其置于其位置Car3而我甚至不知道发生了这样的事情如果我不手动检查结果。至少,我需要“空”位置2(Car2)和正确位置3(Car3)。

HtmlAgility包无法自动识别并修复它。 doc.ParseErrors无法识别它。

你能提供一些XPath函数的组合,比如Substring,Boolean,Concat,Number等吗?我在XPath中不够好,但我觉得这些功能可以帮助识别不一致。

P.S。 Html Tidy库无法修复它。它有时会决定:

<b>Car4 <span>Color224</span></b>

哪个不正确。

1 个答案:

答案 0 :(得分:0)

HtmlDocumemt.ParseErrors确实包含3个错误示例:

 - Start tag <b> was not found (because there is a closing b without an opening one)
 - Start tag <tr> was not found (because the tr is inside an opening b without a closing one)
 - Start tag <td> was not found (same as tr)

在一般情况下,不可能1)以您想要的方式识别错误,2)更难以修复它们。您必须准确定义预期的格式。

您可以使用Html Agility Pack识别具有特定要求的错误。例如,这里有一段代码,根据功能要求验证您的文档,“TD的每个子元素必须是B或SPAN且不得包含多个大子元素”:

    HtmlDocument doc = new HtmlDocument();
    doc.Load("MyFile.htm");

    foreach (HtmlNode childOfTd in doc.DocumentNode.SelectNodes("//td/*"))
    {
        if ((childOfTd.Name != "b") && (childOfTd.Name != "span") || (childOfTd.ChildNodes.Count > 1))
        {
            Console.WriteLine("child error, outerHtml=" + childOfTd.OuterHtml);
        }
    }

要解决此问题,需要原始文本访问(可能是正则表达式,BTW,正则表达式也可以识别简单错误),因为Html Agility Pack构建的DOM不允许您按设计访问不正确的语法节点。