Pack d'agilité HTML Sélectionnez des nœuds

c# html-agility-pack html-parsing

Question

J'essaie d'utiliser le pack HTML Agility pour collecter des données d'un site. J'ai beaucoup de difficulté à comprendre comment utiliser les noeuds de sélection dans un foreach, puis exporter les données vers une liste ou un tableau.

Voici le code avec lequel je travaille jusqu'ici.

       string result = string.Empty;

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(http://www.amazon.com/gp/offer-listing/B002UYSHMM/);
        request.Method = "GET";

        using (var stream = request.GetResponse().GetResponseStream())
        using (var reader = new StreamReader(stream, Encoding.UTF8))
        {
            result = reader.ReadToEnd();
        }

        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        doc.Load(new StringReader(result));
        HtmlNode root = doc.DocumentNode;

        string itemdesc = doc.DocumentNode.SelectSingleNode("//h1[@class='producttitle']").InnerText;  //this works perfectly to get the title of the item
        //HtmlNodeCollection sellers = doc.DocumentNode.SelectNodes("//id['bucketnew']/div/table/tbody/tr/td/ul/a/img/@alt");//this does not work at all in getting the alt attribute from the seller images
        HtmlNodeCollection prices = doc.DocumentNode.SelectNodes("//span[@class='price']"); //this works fine getting the prices
        HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//div[@class='resultsset']/table/tbody[@class='result']/tr"); //this is the code I am working on to try to collect each tr in the result.  I then want to eather add each span.price to a list from this and also add each alt attribute from the seller image to a list.  Once I get this working I will want to use an if statement in the case that there is text for the seller name instead of an image.

        List<string> sellers = new List<string>();
        List<string> prices = new List<string>();

        foreach (HtmlNode node in nodes)
        {
            HtmlNode seller = node.SelectSingleNode(".//img/@alt");  // I am not sure if this works
            sellers.Add(seller.SelectSingleNode("img").Attributes["alt"]); //this definitly does not work and will not compile.

        }

J'ai des commentaires dans le code ci-dessus montrant ce qui fonctionne et ce qui ne fonctionne pas et ce que je veux accomplir.

Si quelqu'un a des suggestions ou de la lecture, ce serait génial! J'ai cherché des forums et des exemples et je n'ai rien trouvé qui me permette de l'utiliser.

Réponse acceptée

Votre premier problème avec les commentés SelectNodes ne fonctionne pas car 'id' n'est pas un nom d'élément, c'est un nom d'attribut. Vous avez utilisé la syntaxe correcte dans vos autres expressions pour sélectionner un attribut et comparer la valeur. Par exemple, //ElementName[@attributeName='value'] . Je pense que même [attributeName='value'] devrait fonctionner, mais je n'ai pas testé cela.

La syntaxe à l'intérieur de la fonction SelectNodes s'appelle "XPath". Ce lien pourrait vous aider.

Le nœud seller vous sélectionnez est un frère du node pour l'itération actuelle, qui est un img avec un attribut alt. Cependant, je pense que la syntaxe correcte que vous voulez est juste img[@alt] .

Le prochain problème où vous dites qu'il ne compilera pas, vérifiez le message d'erreur, ce sera probablement le type d'argument qui se plaint. sellers.Add Je pense cherche à nommer un autre HtmlNode, pas un attribut qui est ce que l'expression à l'intérieur de l'addition renvoie.

Consultez également la documentation du pack Agility HTML et d’autres questions concernant la syntaxe.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi