【问题标题】:HtmlAgilityPack selecting childNodes not as expectedHtmlAgilityPack 选择的子节点不符合预期
【发布时间】:2009-05-13 10:29:06
【问题描述】:

我正在尝试使用 HtmlAgilityPack 库来解析页面中的一些链接,但我没有看到我期望从这些方法中得到的结果。在下面,我有一个 HtmlNodeCollection 链接。对于每个链接,我想检查是否有图像节点,然后解析其属性,但 linkNode 的 SelectNodes 和 SelectSingleNode 方法似乎在搜索父文档而不是 linkNode 的 childNodes 给出了什么?

HtmlDocument htmldoc = new HtmlDocument();
htmldoc.LoadHtml(content);
HtmlNodeCollection linkNodes = htmldoc.DocumentNode.SelectNodes("//a[@href]");

foreach(HtmlNode linkNode in linkNodes)
{
    string linkTitle = linkNode.GetAttributeValue("title", string.Empty);
    if (linkTitle == string.Empty)
    {
        HtmlNode imageNode = linkNode.SelectSingleNode("/img[@alt]");     
    }
}

有没有其他方法可以获取linkNode的图像子节点的alt属性(如果存在)?

【问题讨论】:

    标签: c# .net asp.net xpath html-agility-pack


    【解决方案1】:

    您应该从“/img[@alt]”中删除正斜杠前缀,因为它表示您要从文档的根目录开始。

    HtmlNode imageNode = linkNode.SelectSingleNode("img[@alt]");
    

    【讨论】:

    • Errrm 好的。这对我来说很愚蠢。我以为我错过了什么。抱歉浪费问题空间谢谢。
    • 总是有足够的空间:)
    • 你这个人!一秒钟前,我在诅咒 HtmlAgility 项目,但事实证明他们只是以正确的方式实现了 xpath :)
    • 这对我不起作用(HtmlAgilityPack 1.4.9) - 我必须使用 .// 表示法(答案如下)
    • @wal 上面的语法假定目标 img 是 linkNode 的直接子代。如果你必须使用.//,我猜img 是后代,但不是直系孩子。
    【解决方案2】:

    对于 xpath 查询,您还可以使用“.”。表示搜索应该从当前节点开始。

    HtmlNode imageNode = linkNode.SelectSingleNode(".//img[@alt]");
    

    【讨论】:

    • 默认轴是children,实际上根本不需要前缀。
    【解决方案3】:

    另外,请注意空检查。 SelectNodes 返回 null 而不是空白集合。

    HtmlNodeCollection linkNodes = htmldoc.DocumentNode.SelectNodes("//a[@href]");
    
    **if(linkNodes!=null)**
    {
       foreach(HtmlNode linkNode in linkNodes)
      {
         string linkTitle = linkNode.GetAttributeValue("title", string.Empty);
         if (linkTitle == string.Empty)
         {
           **HtmlNode imageNode = linkNode.SelectSingleNode("img[@alt]");**   
         }
      }
    }
    

    【讨论】:

    猜你喜欢
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多