Ich mache ein Projekt in C #, das im Grunde genommen ein Bildschirm-Scraper für ein Bild-Suchspiel ist. Ich versuche, HTMLAgilityPack zu verwenden, um alle Bildelemente auszuwählen und sie in eine HTMLNodeCollection wie folgt einzufügen:
//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);
}
Beachten Sie, dass URLs eine öffentliche List-Auflistung ist:
public List<string> urls = new List<string>();
Meine foreach-Schleife löst eine Ausnahme aus:
Der Objektverweis wurde nicht auf eine Instanz eines Objekts festgelegt.
Überprüfen Sie die Autos, natürlich , imgs ist null. Gibt es einen besseren Weg, um die Ursache dieses Problems zu finden? Ich habe keine Ahnung, ob es mein Xpath oder was ist.
Der frustrierendste Teil ist, dass ich es bereits zur Arbeit gebracht habe, aber meine Dateiversionen durcheinander gebracht und meine Arbeit verloren hat. Derp.
Sie könnten einen Tippfehler in der folgenden Zeile haben:
HtmlAttribute src = img.Attributes["@src"];
Ich habe das für mich arbeiten lassen (beachte die @ Position):
HtmlAttribute src = img.Attributes[@"src"];
Das funktioniert für mich. Ich denke, dass Ihr Dokument nicht korrekt geladen wird, daher gibt der Xpath keine Übereinstimmungen zurück.
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
}