HTMLAgilityPack SelectNodes pour tout sélectionner éléments

c# html html-agility-pack regex xpath

Question

Je réalise un projet en C # qui est essentiellement un grattoir d’image pour un jeu lié à la recherche d’images. J'essaie d'utiliser HTMLAgilityPack pour sélectionner tous les éléments de l'image et les placer dans un HTMLNodeCollection, comme ceci:

//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);
}

Notez que les urls sont une collection publique de la liste:

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

Ma boucle foreach lance une exception:

La référence d'objet n'est pas définie à une instance d'un objet.

Vérification des autos, bien sûr, imgs est null. Existe-t-il un meilleur moyen de localiser la source de ce problème? Je ne sais pas si c'est mon Xpath ou quoi.

La partie la plus frustrante, c’est que je l’ai déjà fait fonctionner, mais que j’ai gâché les versions de mes fichiers et perdu mon travail. Derp.

Réponse acceptée

Vous pourriez avoir une faute de frappe dans la ligne suivante:

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

Je dois que cela fonctionne pour moi (notez le @ position):

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

Réponse populaire

Cela fonctionne pour moi. Je pense que votre document n'est pas chargé correctement, donc xpath ne renvoie aucune correspondance.

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
}


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow