XPath出现问题

本文关键字:问题 XPath | 更新日期: 2023-09-27 17:58:29

这里有一个链接:

http://www.covers.com/pageLoader/pageLoader.aspx?page=/data/nba/results/2010-2011/boxscore819588.html

我使用的是HTML敏捷包,我想从"赔率"列中提取188。当被问及路径时,我的编辑器会给出/html/body/form/div/div[2]/div/table/tr/td[2]/div/table/tr[3]/td[7]。我尝试了使用body或html的各种省略的路径,但当传递给.DocumentNode.SelectNodes()时,它们都没有返回任何结果。我还在一开始尝试使用//(我认为它是文档树的根)。什么东西?

编辑:

代码:

        WebClient client = new WebClient();
        string html = client.DownloadString(url);
        HtmlDocument doc = new HtmlDocument();
        doc.LoadHtml(html);
        foreach(HtmlNode node in doc.DocumentNode.SelectNodes("/some/xpath/expression"))
        {
            Console.WriteLine("[" + node.InnerText + "]");
        }

XPath出现问题

在抓取站点时,您不能安全地依赖工具提供的确切XPATH,因为通常情况下,它们限制性太强,事实上大多数时候都一无所获。最好的方法是查看HTML,并确定对更改更有弹性的内容。

以下是一段适用于您的示例的代码:

    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
    doc.Load(your html);
    foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//a[text()='MIA']/ancestor::tr/td[7]"))
    {
        Console.WriteLine(node.InnerText.Trim());
    }

输出CCD_ 4。

它的工作方式是:

  • 选择内部文本设置为"MIA"的A元素
  • 查找此A元素的父TR元素
  • 到达该TR元素的第七个TD
  • 然后我们使用该TD元素的InnerText属性

试试这个:

/html/body/form/div/div[2]/div/table/*/tr/td[2]/div/table/*/tr[3]/td[7]

*捕获强制的<tbody>元素,该元素是表的DOM表示的一部分,即使它在HTML中没有表示。

除此之外,通过ID、CSS类名或其他一些唯一属性进行选择比通过层次结构和文档结构进行选择更稳健:

//table[@class='data']//tr[3]/td[7]

默认情况下,HtmlAgilityPack会以不同的方式处理表单标记(因为表单标记可能重叠),因此您需要从xpath中删除表单标记,例如:/html/body//div/div[2]/div/table/tr/td[2]/div/table/tr[3]/td[7]

另一种方法是强制HtmlAgilityPack将表单标签视为其他标签:

HtmlNode.ElementsFlags.Remove("form");