HTML Agility Pack Wählen Sie Knoten aus

c# html-agility-pack html-parsing

Frage

Ich versuche, das HTML Agility-Paket zu verwenden, um einige Daten von einer Site zu scrappen. Ich habe wirklich Schwierigkeiten, herauszufinden, wie man innerhalb einer foreach selectnodes verwendet und dann die Daten in eine Liste oder ein Array exportiert.

Hier ist der Code, mit dem ich bisher gearbeitet habe.

       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.

        }

Ich habe Kommentare im obigen Code, die zeigen, was funktioniert und was nicht und was ich erreichen möchte.

Wenn jemand irgendwelche Vorschläge hat oder liest, wäre das großartig! Ich habe Foren und Beispiele gesucht und bin nicht über alles gekommen, was ich benutzen kann.

Akzeptierte Antwort

Das erste Problem mit den SelectNodes funktioniert nicht, da 'id' kein Elementname ist, sondern ein Attributname. Sie haben die korrekte Syntax in Ihren anderen Ausdrücken verwendet, um ein Attribut auszuwählen und den Wert zu vergleichen. ZB //ElementName[@attributeName='value'] . Ich denke sogar [attributeName='value'] sollte funktionieren, aber ich habe das nicht getestet.

Die Syntax in der SelectNodes Funktion heißt "XPath". Dieser Link könnte Ihnen helfen.

Der seller , den Sie auswählen, ist ein Geschwister des node für die aktuelle Iteration, bei dem es sich um ein IMG mit einem Alt-Attribut handelt. Ich denke jedoch, dass die richtige Syntax nur img[@alt] .

Das nächste Problem, wo Sie sagen, dass es nicht kompilieren wird, überprüfen Sie die Fehlermeldung, wird es wahrscheinlich zurück Beschwerdearten werden. sellers.Add Ich denke, sucht einen anderen HtmlNode, nicht ein Attribut, was der Ausdruck innerhalb der add ist zurückgibt.

Sehen Sie sich auch die Html Agility Pack-Dokumentation und andere Fragen zur Syntax an.




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum