HtmlAgilityPack选择childNodes不符合预期

She*_*eff 38 .net c# asp.net xpath html-agility-pack

我试图使用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]");     
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有其他方法可以获得linkNode的image childnode的alt属性(如果存在)?

ult*_*ife 40

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

HtmlNode imageNode = linkNode.SelectSingleNode(".//img[@alt]");
Run Code Online (Sandbox Code Playgroud)


Ric*_*lay 38

您应该从"/ img [@alt]"中删除forwardslash前缀,因为它表示您要从文档的根目录开始.

HtmlNode imageNode = linkNode.SelectSingleNode("img[@alt]");
Run Code Online (Sandbox Code Playgroud)

  • 总有足够的空间:) (3认同)

msq*_*sqr 10

另外,请注意Null Check.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]");**   
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是IMO真正愚蠢的设计决定.它没有理由*不应该*返回空集合. (4认同)