Sachin Makwana Ответов: 2

Как извлечь url-адреса изображений с помощью пакета HTML agility Pack ?


Я с помощью HTML ловкость обновления, чтобы извлечь URL-адрес изображения от введенного веб-адреса.

Я могу получать изображения, за исключением ... Paytm.com".

В paytm.com, когда я вижу источник страницы, он отображает 5 тегов "img", где, как я получаю только 3.

Может ли кто-нибудь сказать мне, почему я получаю только три изображения в списке вместо пяти, и как я могу решить эту проблему?

Что я уже пробовал:

string[] imgList = new string[20];
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.Load("https://paytm.com/");
var i=0;
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//img"))
{
    imgList[i] = node.Attributes["src"].Value;
    i++;
}

Sergey Alexandrovich Kryukov

Покажите фрагменты исходного HTML - кода, о котором идет речь. Посмотрите на 5 случаев "img" и попытайтесь увидеть разницу между ними. Скорее всего, другие IMG просто имеют другой уровень вложенности.
—СА

[no name]

В настоящее время я использую приведенный выше код в своем проекте. Он прекрасно работает, за исключением ... paytm.com".

Как я могу проверить, имеет ли IMG другой уровень вложенности или нет?

Sergey Alexandrovich Kryukov

Твоя логика не работает.
"Ваша проблема заключается в другом вложении" не означает "нужно проверить вложенность"...
Вы заметили: я уже ответил на ваш вопрос.

И еще раз обратите внимание: вы задаете этот вопрос и все еще не показываете HTML с соответствующим якорем.

—СА

[no name]

Я не понимаю, к чему ты клонишь!
Я использую приведенный выше код. там нет файла HTML-страницы. Я загружаю документы с помощью пакета HTMLAgility pack, если получаю код ответа "OK".

Я проверял код, просматривая источник url-адреса, и там я обнаружил проблему. Я получал 3 изображения, где, как есть 5 изображений, я могу видеть на странице источник "https://www.paytm.com".

Я не смог выяснить, почему, поэтому отправил этот вопрос. Там нет такого HTML существует, как я использую выше код, чтобы показать.

Sergey Alexandrovich Kryukov

Посмотрите на мое решение и, пожалуйста, скажите мне, что неясно.
Я понятия не имею, о чем вы говорите. Если вы используете пакет HTML Agility pack, то у вас есть HTML-страница.
—СА

Richard Deeming

Я удивлен, что вы видите какие-либо URL-адреса изображений; этот сайт использует AngularJS, поэтому, если вы не выполните скрипт на странице, ни один из них не будет работать. <img> теги есть src набор атрибутов.

Кроме того, вы должны использовать List<string> вместо массива. Если страница содержит более 20 изображений, ваш текущий код завершится с ошибкой. IndexOutOfRangeException.

[no name]

Да, он использует AngularJs. Я могу вычеркнуть значения ng-src. но проблема в том, что в исходном коде страницы есть пять тегов img, а во время выполнения я получаю только три.

Массив размером 20 предназначен только для тестирования. Позже я буду использовать List<string>.

2 Ответов

Рейтинг:
1

Amit Dubey

<pre lang="c#">

публичный статический список<string> AllImages(string startURL)
{
return SpecificLinks(startURL, "//img", "src");
}

публичный статический список<string> SpecificLinks(string startUrl, string elementSelector, string attributeSelector)
{
Список<строка> По одной = новый список<строка&ГТ;();

HtmlWeb hw = новый HtmlWeb();
HtmlDocument doc = hw.Load(startUrl);
HtmlNodeCollection docNodes;

пробовать
{
docNodes = doc.DocumentNode.Метод selectnodes(elementSelector);
}
ловить
{
docNodes = нуль;
}

if (docNodes != null)
{
foreach (ссылка HtmlNode в doc.DocumentNode.Метод selectnodes(elementSelector))
{
string elementSource = ссылка.GetAttributeValue(attributeSelector, "#");

if (!elementSource.Равняется("#"))
{
пробовать
{
Uri uri = new Uri(новый Uri(startUrl), elementSource);

if (!elementSource.Равно(Ури.Метод toString()))
elementSource = uri.Метод toString();
еще
elementSource = "#";
}
catch (исключение)
{
elementSource = "#";
}
}

if (!elementSource.Равняется("#"))
связи.Добавить(elementSource);
}
}

обратные ссылки;
}


Рейтинг:
0

Sergey Alexandrovich Kryukov

Пожалуйста, смотрите мой комментарий к этому вопросу.

Этот вопрос имеет мало смысла, потому что вы не показали, как элемент, который вы ищете, написан в оригинальном HTML. На самом деле, вы можете создать несколько локальных файлов и просто поэкспериментировать с этим простым материалом, читая документацию. Как кто-то может помочь, если вы не предоставляете исходную информацию?

Тем не менее, я думаю, что наиболее вероятной причиной отсутствия некоторых ваших документов является разный уровень их вложенности. Посмотрите на ваше выражение "//img". '//' означает "более глубокий потомок", amd ' / ' - это непосредственный потомок. Вы ищете элементы только на одном уровне. Чтобы получить эту идею, пожалуйста, смотрите: XPath — Википедия, свободная энциклопедия[^].

Да, документация HTML Agility pack объясняет, что он поддерживает XPATH и XSLT, но утверждает: "на самом деле вам не нужно понимать XPATH или XSLT, чтобы использовать его, не волнуйтесь…" Ну, я, вероятно, могу понять, что они означают, но это вряд ли означает, что вы можете использовать его без какого-либо понимания вообще, не имея понятия, что, скажем, делает XPATH. Конечно, вы все еще должны изучить самые основы этого.

Кроме того, вы можете собрать все элементы, соответствующие определенным критериям, если вы проанализируете весь документ, каждый элемент, распознаете/отфильтруете их и соберете соответствующий результат в некоторых случаях. коллекция Обычно это не займет больше времени, чем загрузка самого ресурса (вы все равно скачиваете его, и инструменты все это разбирают), но даст вам результат, менее зависящий от конкретной структуры документа.

—СА