Подтвердить что ты не робот

HtmlAgilityPack выбор childNodes не так, как ожидалось

Я пытаюсь использовать библиотеку HtmlAgilityPack для анализа некоторых ссылок на странице, но я не вижу результатов, которые я ожидал бы от методов. В следующем случае у меня есть HtmlNodeCollection ссылок. Для каждой ссылки я хочу проверить, есть ли изображение node, а затем проанализировать его атрибуты, но методы SelectNodes и SelectSingleNode для linkNode, похоже, ищут родительский документ, а не 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, если он существует?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

Кроме того, следите за 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]");**   
     }
  }
}