C # Html Agility Pack анализирует теги с несколькими альтернативами

c# html html-agility-pack tags

Вопрос

У меня нет опыта работы с HTML, поэтому извините любую неправильную терминологию.

Я пытаюсь проанализировать HTML-документ с помощью пакета Agility Pack, и я ищу очень конкретную строку.

Я хочу получить все строки формы:

<img src="..." etc=....">

Поэтому мой параметр select

HtmlNodeCollection images = doc.DocumentNode.SelectNodes("//img[@src]");

Однако это также приводит к возвращению строк, таких как

<img width="..." src="..." etc="..">

Мне кажется (по крайней мере, насколько мне известно): Ищем тег img, и src нужно найти только на том же уровне, не обязательно рядом с тегом img.

Посмотрев документацию, я чувствую, что я пытаюсь сделать что-то, с чем мне не позволено с этой функцией.

Может кто-нибудь, пожалуйста, предложите правильный способ сделать это. Благодаря!

Принятый ответ

« Тег img выполняется, и src нужно найти только на том же уровне, не обязательно рядом с тегом img ».

Кажется, что вы хотите найти элемент <img> где атрибуты src являются первым атрибутом. Обратите внимание, что парсер XML / HTML не должен сохранять порядок атрибутов, поэтому обычно вы не хотите выбирать элемент, основанный на определенном порядке атрибута, т.е. когда атрибут src появляется первым и т. Д.

В любом случае, порядок атрибутов сохраняется в HAP в моем упрощенном тесте, следовательно, используя Attributes[0].Name *, чтобы проверить имя первого атрибута, также работал:

var raw = @"<div>
    <img src=""..."" etc=""...."">
    <img width=""..."" src=""..."" etc="".."">
    <img>
</div>";
var doc = new HtmlDocument();
doc.LoadHtml(raw);
var result = doc.DocumentNode
                .SelectNodes("//img[@src]")
                .Where(o => o.Attributes[0].Name == "src")
                .ToList();
foreach (var item in result)
{
    Console.WriteLine(item.OuterHtml);
}

вывод :

<img src="..." etc="....">

*) XPath уже фильтрует элементы img с атрибутом src , поэтому Attributes[0].Name никогда не будут создавать NRE, если вы заинтересованы.


Популярные ответы

Я не знаком с XPATH, поэтому я предполагаю, что ваш правильный (я обычно использую селектора css, используя библиотеку ScrapySharp в дополнение к HtmlAgilityPack).

Следующий фрагмент кода проекта консоли возвращает только желаемый узел img, т. Е. Тот, у которого есть только два атрибута - src и т. Д., Не менее, не более. Я вручную загружаю образец html с тремя узлами изображения, например:

        HtmlDocument doc = new HtmlDocument();
        string html = @"
            <img src='img1.jpg' />
            <img src='img1.jpg' etc='etcValue' />
            <img width='200px' src='img1.jpg' />
        ";
        doc.LoadHtml(html);

        var relevantImgNodes = doc.DocumentNode.SelectNodes("//img")
            .Where(n => 
                n.Attributes.Count == 2 && 
                !string.IsNullOrEmpty(n.GetAttributeValue("src")) && 
                !string.IsNullOrEmpty(n.GetAttributeValue("etc")));

        Console.WriteLine(relevantImgNodes.Count()); // prints 1


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему