HTML Agility Pack Seleziona nodi

c# html-agility-pack html-parsing

Domanda

Sto cercando di utilizzare il pacchetto HTML Agility per analizzare alcuni dati da un sito. Sto davvero cercando di capire come usare selectnode all'interno di un foreach e poi esportare i dati in un elenco o array.

Ecco il codice con cui sto lavorando finora.

       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.

        }

Ho commenti nel codice sopra che mostra cosa funziona e cosa no e in che cosa voglio ottenere.

Se qualcuno ha qualche suggerimento o lettura, sarebbe fantastico! Ho cercato forum ed esempi e non ho mai trovato nulla che potessi usare.

Risposta accettata

Il tuo primo problema con i SelectNodes commentati non funziona perché "id" non è un nome di elemento, è un nome di attributo. Hai utilizzato la sintassi corretta nelle altre espressioni per selezionare un attributo e confrontare il valore. Ad esempio, //ElementName[@attributeName='value'] . Penso che anche [attributeName='value'] dovrebbe funzionare, ma non l'ho testato.

La sintassi all'interno della funzione SelectNodes è denominata "XPath". Questo link potrebbe aiutarti.

Il nodo seller si sta selezionando è un fratello di node per l'iterazione corrente che è un img con un attributo alt. Comunque penso che la sintassi corretta che vuoi sia solo img[@alt] .

Il prossimo problema in cui dici che non verrà compilato, controlla il messaggio di errore, probabilmente si lamenterà dei tipi di argomenti back. sellers.Add Penso che stia cercando di nominare un altro HtmlNode, non un attributo che è ciò che restituisce l'espressione all'interno dell'aggiunta.

Inoltre, controlla i documenti del pacchetto Agilità HTML e altre domande sulla sintassi.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché