HtmlAgilityPack - 后代的SelectSingleNode

时间:2018-04-13 14:06:58

标签: html-agility-pack

我发现HtmlAgilityPack SelectSingleNode总是从原始DOM的第一个节点开始。是否有一个等效的方法来设置其起始节点?

示例html

<html>
  <body>
    <a href="https://home.com">Home</a>
    <div id="contentDiv">
    <tr class="blueRow">
        <td scope="row"><a href="https://iwantthis.com">target</a></td>
    </tr>
    </div>
  </body>
</html>

不工作代码

//Expected:iwantthis.com  Actual:home.com, 
string url = contentDiv.SelectSingleNode("//tr[@class='blueRow']")
                       .SelectSingleNode("//a") //What should this be ?
                       .GetAttributeValue("href", "");

我必须用以下代码替换上面的代码:

    var tds = contentDiv.SelectSingleNode("//tr[@class='blueRow']").Descendants("td");
    string url = "";
    foreach (HtmlNode td in tds)
    {
        if (td.Descendants("a").Any())
        {
            url= td.ChildNodes.First().GetAttributeValue("href", "");
        }
    }

我在.Net Framework 4.6.2上使用HtmlAgilityPack 1.7.4

1 个答案:

答案 0 :(得分:1)

您使用的XPath始终从文档的根目录开始。 SelectSingleNode("//a")表示从文档的根目录开始,在文档的任何位置找到第一个a;这就是它抓住Home链接的原因。

如果要从当前节点开始,则应使用.选择器。 SelectSingleNode(".//a")意味着找到当前节点下任何位置的第一个a

所以你的代码看起来像这样:

string url = contentDiv.SelectSingleNode(".//tr[@class='blueRow']")
                   .SelectSingleNode(".//a")
                   .GetAttributeValue("href", "");