Member 12268183 Ответов: 0

Как загрузить HTML-страницу с помощью пакета htmlagility pack C#?


- Привет!

Я хотел бы загрузить html-страницу и взять некоторую информацию, создавая приложение C#.



Я получил следующую ошибку:


Необработанное исключение типа "System.NullReferenceException" произошло в CursorMove.exe

Дополнительная информация: ссылка на объект не установлена на экземпляр объекта.


Не могли бы вы мне помочь?

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

...
HtmlAgilityPack.HtmlWeb web = new HtmlAgilityPack.HtmlWeb();

string url = "https://www.site.com";

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();

doc = web.Load(url);

var nodes = doc.DocumentNode.SelectSingleNode("//span[@ class='a-size-medium']");

var inner = doc.DocumentNode.SelectNodes("//div[@ class='sc-list-item-content']");

foreach (HtmlAgilityPack.HtmlNode item44 in inner) (//The error is in this line//)
{
  cnt_array[cnt] = item44.InnerText;
  textBox2.Text = cnt_array[5];
  cnt++;
}

...

F-ES Sitecore

Вероятно, существует проблема с загрузкой url-адреса, который вы ему даете, или проблема с html-кодом на этом url-адресе.

Kornfeld Eliyahu Peter

На какой линии ошибка?

Member 12268183

Вот мой код (я отметил строку с ошибкой. Приложение построено успешно но во время выполнения возникает ошибка):

var nodes = doc.DocumentNode.SelectSingleNode("//span[@ class='a-size-medium']");

ВАР внутренний = док.DocumentNode.Метод selectnodes("//див[@ класс='СК-списка, элемента и содержание']");

foreach (HtmlAgilityPack.HtmlNode item44 in inner) (//ошибка находится в этой строке//)
{
cnt_array[cnt] = item44.Через свойство innerText;
textBox2.Text = cnt_array[5];
НКТ++;
}

Kornfeld Eliyahu Peter

Это означает, что "внутреннее" равно нулю.
Но это вы должны знать, если будете использовать отладчик...
Есть две возможные причины:
1. у вас действительно есть пробел (' ') между '@' и 'class'
2. Нет див с таким классом вы ищете - посмотреть содержимое страницы

Mike V Baker

Из документов:
Возвращается:
Пакет HtmlAgilityPack.HtmlNodeCollection содержит коллекцию узлов, соответствующих HtmlAgilityPack.HtmlNode.Запрос XPath, ***или null, если ни один узел не соответствует*** выражению XPath.

Вы проверили, что ваша функция SelectNodes должна возвращать как минимум несколько узлов? Проверили синтаксис поиска? Чувствительность к регистру критериев поиска?
Поскольку документ говорит, что он может возвращать null, вы должны проверить, если (inner != null), прежде чем пытаться его использовать.
ХТХ, Майк

Richard Deeming

Хороший улов. Это похоже на плохой дизайн API - вы ожидаете, что он вернет пустую коллекцию, если не будет совпадений.

Member 12268183

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

Member 12268183

Я попробовал с другой веб-страницы, и все в порядке. Есть ли что-то особенное в amazon pages?

Richard Deeming

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

Вероятно, вам нужно будет посмотреть, предлагает ли Amazon API, чтобы вы могли получить информацию, не пытаясь "очистить" страницу.

Member 12268183

Спасибо!
Как я могу увидеть, если Amazon предлагает API, позволяющий получить информацию?

Richard Deeming

Спросите Амазонку.

0 Ответов