40

我正在尝试使用 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属性吗?

4

3 回答 3

43

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

HtmlNode imageNode = linkNode.SelectSingleNode("img[@alt]");
于 2009-05-13T10:46:27.703 回答
42

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

HtmlNode imageNode = linkNode.SelectSingleNode(".//img[@alt]");
于 2010-11-18T04:30:51.880 回答
10

另外,请注意空检查。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]");**   
     }
  }
}
于 2009-05-13T12:33:00.293 回答