HtmlAgilityPack выбирает дочерние узлы не так, как ожидалось - PullRequest
37 голосов
/ 13 мая 2009

Я пытаюсь использовать библиотеку HtmlAgilityPack для анализа некоторых ссылок на странице, но я не вижу результатов, которые я ожидаю от методов. В следующем у меня есть HtmlNodeCollection ссылок. Для каждой ссылки я хочу проверить, существует ли узел изображения, а затем проанализировать его атрибуты, но методы linkNode SelectNodes и SelectSingleNode, кажется, ищут родительский документ, а не childNodes linkNode, что дает?

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]");     
    }
}

Есть ли другой способ получить атрибут alt дочернего узла изображения linkNode, если он существует?

Ответы [ 3 ]

40 голосов
/ 18 ноября 2010

С запросом xpath вы также можете использовать "." чтобы указать, что поиск должен начинаться с текущего узла.

HtmlNode imageNode = linkNode.SelectSingleNode(".//img[@alt]");
37 голосов
/ 13 мая 2009

Вы должны удалить префикс forwardwardslash из "/ img [@alt]", так как это означает, что вы хотите начать с корня документа.

HtmlNode imageNode = linkNode.SelectSingleNode("img[@alt]");
10 голосов
/ 13 мая 2009

Кроме того, следите за нулевой проверкой. SelectNodes возвращает пустое значение вместо пустой коллекции.

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]");**   
     }
  }
}
...