首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HtmlAgilityPack - SelectSingleNode为后代

HtmlAgilityPack - SelectSingleNode为后代
EN

Stack Overflow用户
提问于 2018-04-13 14:06:58
回答 1查看 574关注 0票数 0

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

样本html

代码语言:javascript
复制
<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>

不工作代码

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

我必须将上面的代码替换为:

代码语言:javascript
复制
    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框架4.6.2上使用.Net 1.7.4

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-13 19:14:42

您使用的XPath总是从文档的根开始。SelectSingleNode("//a")意味着从文档的根目录开始,并在文档中的任何地方找到第一个a;这就是它获取主页链接的原因。

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

所以您的代码将如下所示:

代码语言:javascript
复制
string url = contentDiv.SelectSingleNode(".//tr[@class='blueRow']")
                   .SelectSingleNode(".//a")
                   .GetAttributeValue("href", "");
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49818917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档