Выбор узла пакета HTML Agility - PullRequest
0 голосов
/ 17 мая 2019

Я новичок в HTML Agility Pack (а также в сетевом программировании в целом). Я пытаюсь извлечь определенную строку HTML, но я не знаю достаточно о синтаксисе HTML Agility Pack, чтобы понять, что я пишу неправильно (и потерян в их документации). URL-адреса здесь изменены.

        string html;
        using (WebClient client = new WebClient())
        {
            html = client.DownloadString("https://google.com/");
        }

        HtmlDocument doc = new HtmlDocument();
        doc.LoadHtml(html);

        foreach (HtmlNode img in doc.DocumentNode.SelectNodes("//div[@class='ngg-gallery-thumbnail-box']//div[@class='ngg-gallery-thumbnail']//a"))
        {
            Debug.Log(img.GetAttributeValue("href", null));
        }

        return null;

Вот как выглядит HTML

<div id="ngg-image-3" class="ngg-gallery-thumbnail-box" >
    <div class="ngg-gallery-thumbnail">
            <a href="https://urlhere.png"
             // More code here
            </a>
    </div>
</div>

Проблема возникает в строке foreach. Я попробовал соответствующие примеры онлайн, как могу, но мне не хватает этого. ТИА.

1 Ответ

0 голосов
/ 22 мая 2019

HTMLAgilityPack использует синтаксис XPath для запроса узлов - HAP эффективно преобразует документ HTML в документ XML. Итак, хитрость заключается в изучении запросов XPATH, чтобы вы могли получить правильные комбинации тегов и атрибутов, чтобы получить нужный вам результат.

Вставленный вами HTML-фрагмент неправильно сформирован (нет закрывающего > на теге привязки. Если он закрыт, то

//div[@class='ngg-gallery-thumbnail-box']//div[@class='ngg-gallery-thumbnail']//a[@href]

вернет XPathNodeList только тех тегов, которые имеют атрибуты href.

Если ни один из них не соответствует вашим критериям, ничего не будет написано.

В целях отладки, возможно, зарегистрируйте менее конкретное количество узлов запросов или OuterXml, чтобы увидеть, что вы получаете, например.

Debug.Log(doc.DocumentNode.SelectNodes("//div[@class='ngg-gallery-thumbnail-box']//div[@class='ngg-gallery-thumbnail'])[0].OuterXml)
...