Nodos de selección de paquetes de agilidad HTML

c# html-agility-pack html-parsing

Pregunta

Estoy tratando de usar el paquete de agilidad HTML para raspar algunos datos de un sitio. Estoy realmente luchando para averiguar cómo utilizar selectnodes dentro de un foreach y luego exportar los datos a una lista o matriz.

Aquí está el código con el que estoy trabajando hasta ahora.

       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.

        }

Tengo comentarios en el código anterior que muestran lo que funciona y lo que no, y el tipo de lo que quiero lograr.

Si alguien tiene alguna sugerencia o lectura sería genial! He estado buscando en foros y ejemplos y no he encontrado nada que pueda usar.

Respuesta aceptada

Su primer problema con los SelectNodes comentados no funciona porque 'id' no es un nombre de elemento, es un nombre de atributo. Ha utilizado la sintaxis correcta en sus otras expresiones para seleccionar un atributo y comparar el valor. Por ejemplo, //ElementName[@attributeName='value'] . Creo que incluso [attributeName='value'] debería funcionar, pero no he probado esto.

La sintaxis dentro de la función SelectNodes se llama "XPath". Este enlace podría ayudarte.

El nodo seller que está seleccionando es un hermano de node para la iteración actual que es un img con un atributo alt. Sin embargo, creo que la sintaxis correcta que desea es simplemente img[@alt] .

El siguiente problema en el que dice que no se compilará, verifique el mensaje de error, probablemente se quejará de los tipos de argumentos. sellers.Add que creo que está buscando nombrar otro HtmlNode, no un atributo que es lo que la expresión dentro del complemento está devolviendo.

Además, echa un vistazo a la documentación del paquete Html Agility y otras preguntas relacionadas con la sintaxis.



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow