HTMLAgilityPack SelectNodes для выбора всех <img>элементов - PullRequest
12 голосов
/ 25 октября 2011

Я делаю проект на C #, который в основном представляет собой скребок для экрана для игры, связанной с поиском изображений. Я пытаюсь использовать HTMLAgilityPack, чтобы выделить все элементы изображения и поместить их в коллекцию HTMLNodeCollection, например:

//set up for checking autos

HtmlNodeCollection imgs = new HtmlNodeCollection(doc.DocumentNode.ParentNode);
imgs = doc.DocumentNode.SelectNodes("//img");

foreach (HtmlNode img in imgs)
{
    HtmlAttribute src = img.Attributes["@src"];
    urls.Add(src.Value);
}

Обратите внимание, что urls является общедоступной коллекцией списка:

public List<string> urls = new List<string>();

Мой цикл foreach вызывает исключение:

Ссылка на объект не установлена ​​для экземпляра объекта.

Проверка авто, конечно же, imgs - ноль. Есть ли лучший способ, чтобы я мог отследить источник этой проблемы? Я понятия не имею, если это мой Xpath или что.

Самым неприятным моментом является то, что я уже заставил его работать, но испортил свои версии файлов и потерял свою работу. Derp.

Ответы [ 2 ]

12 голосов
/ 01 февраля 2012

У вас может быть опечатка в следующей строке:

HtmlAttribute src = img.Attributes["@src"];

Я понял, что это работает для меня (обратите внимание на @ позицию):

HtmlAttribute src = img.Attributes[@"src"];
3 голосов
/ 25 октября 2011

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

HtmlDocument htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml("<html><head></head><body><div><img /><div><img /><img/></div></div><img/></body></html>");

var nodes = htmlDocument.DocumentNode.SelectNodes("//img");
// 4 nodes found
foreach (var node in nodes)
{
    // do stuff
}
...