Как получить первое вхождение src с помощью HTML Agility Pack

из-за недопустимого форматирования XML-файлов, которые у меня есть, я использую HTML Agility Pack. Я разбираю, например, этот канал: https://www.rioseo.com/feed/

У меня есть массив этих элементов (поэтому "src" всегда уникален):

<content:encoded><![CDATA[<h2><a href="https://resources.rioseo.com/c/gbp-guide-for-hospit?x=0hTW-s"><img class="alignnone size-full wp-image-23086" src="https://www.rioseo.com/wp-content/uploads/2022/04/Rio_eBook_GBP-Guide-for-Hospitality-Brands_April2022_Hero.jpg" alt="" width="1200" height="409" srcset="https://www.rioseo.com/wp-content/uploads/2022/04/Rio_eBook_GBP-Guide-for-Hospitality-Brands_April2022_Hero-200x68.jpg 200w, https://www.rioseo.com/wp-content/uploads/2022/04/Rio_eBook_GBP-Guide-for-Hospitality-Brands_April2022_Hero-300x102.jpg 300w, https://www.rioseo.com/wp-content/uploads/2022/04/Rio_eBook_GBP-Guide-for-Hospitality-Brands_April2022_Hero-400x136.jpg 400w,

Я хочу получить только первый URL-адрес изображения из атрибута src, поэтому мой ожидаемый результат должен быть (массив URL-адресов):

{'https://www.rioseo.com/wp-content/uploads/2022/04/Rio_eBook_GBP-Guide-for-Hospitality-Brands_April2022_Hero.jpg',
https://another.url.extracted.from.the.array.of.'content_encoded'}

Я могу вывести весь элемент img из узла с кодировкой содержимого с помощью:

var images = doc.DocumentNode.SelectNodes(".//*[name()='content:encoded']/img").ToArray();
foreach (var item in images)
     {
          Console.WriteLine("image: " + item.OuterHtml);
     }

Другие методы, кроме OuterHtml, дают мне пустой вывод.

Я также могу вывести каждый img из этой строки с помощью:

var items = doc.DocumentNode.SelectNodes("//img[@src]").ToArray();
foreach (var image in items)
     {
          Console.WriteLine("img: " + image.Attributes["src"].Value);
     }

Я знаю, что мне нужно извлечь первое вхождение «https» из элемента img. Я пробовал много xpaths, но я не могу его получить. Возможно, мой xpath неверен, но я не знаю, как это исправить.

Любая помощь будет очень признательна :), спасибо!

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
0
39
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваш образец content:encoded неполный, но я думаю, что это может быть решением:

var images = doc.DocumentNode.SelectNodes(".//*[name()='content:encoded']//img")
    .Select(item => item.GetAttributeValue("src", null))
    .Where(item => item != null)
    .ToList();
foreach (var url in images)
{
    Console.WriteLine("image: " + url);
}

XPATH такой же, как у вас, но с двумя // в img из-за CDATA. Затем я выбираю атрибут src (или null, если он не существует) и фильтрую нулевые элементы (изображения без src, которых, я полагаю, у вас нет, но это проверка работоспособности).

Я протестировал его, и он возвращает все URL-адреса из элемента content:encoded. Как получить только первый? (Я отредактировал свой вопрос со ссылкой на канал, который я анализирую)

Mi Yahn 24.04.2022 12:55

Может быть, это? ".//*[name()='content:encoded']//img[1]". Является 1-индексом, поэтому для получения первого изображения мы ставим [1], а не [0]

Victor 24.04.2022 15:20
Ответ принят как подходящий

Думаю, я понял, с RegEx я просто делаю:

var items = doc.DocumentNode.SelectNodes(".//item").ToArray();
foreach (var item in items)
         {
              string matchString = Regex.Match(item.OuterHtml, "<img.+?src=[\"'](.+?)      [\"'].*?>", RegexOptions.IgnoreCase).Groups[1].Value;
              Console.WriteLine("img: " + matchString);
         }

Другие вопросы по теме