HtmlAgilityPack选择childNodes不符合预期

时间:2009-05-13 10:29:06

标签: c# .net 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]");     
    }
}

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

3 个答案:

答案 0 :(得分:40)

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

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

答案 1 :(得分:37)

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

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

答案 2 :(得分: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]");**   
     }
  }
}