2011-11-13 45 views
6

Estoy tratando de usar el paquete HTML Agility para eliminar algunos datos de un sitio. Realmente estoy luchando para descubrir cómo usar selectnodes dentro de un foreach y luego exportar los datos a una lista o matriz.HTML Agility Pack Seleccionar nodos

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 que sería genial! He estado buscando foros y ejemplos y no he encontrado nada que pueda usar.

Respuesta

11

Su primer problema con el comentario SelectNodes no funciona porque 'id' no es un nombre de elemento, es un nombre de atributo. Usó 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". This link 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 solo img[@alt].

El siguiente problema donde dices que no se compilará, verifica el mensaje de error, probablemente se queje atrás tipos de argumentos. sellers.Add Creo que está buscando nombrar otro HtmlNode, no un atributo que es lo que devuelve la expresión dentro del complemento.

Además, consulte los documentos del paquete Html Agility y otras preguntas relacionadas con la sintaxis.

Cuestiones relacionadas