2011-11-13 46 views
6

我正在尝试使用HTML敏捷性包从网站上刮取一些数据。我真的很努力研究如何在foreach中使用selectnodes,然后将数据导出到列表或数组。HTML敏捷包选择节点

这是我目前使用的代码。

 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. 

     } 

我在上面的代码中有评论,显示什么有效,什么没有,以及我想要完成什么。

如果有人有任何建议或阅读,那就太棒了!我一直在寻找论坛和例子,并没有涉及任何我可以使用的东西。

回答

11

您的第一个问题与注释掉SelectNodes不起作用,因为'id'不是一个元素名称,它是一个属性名称。您在其他表达式中使用了正确的语法来选择属性并比较值。例如,//ElementName[@attributeName='value']。我认为即使[attributeName='value']应该工作,但我没有测试过。

SelectNodes函数内的语法被称为“XPath”。 This link可能会帮助你。

您正在选择的seller节点是当前迭代的一个node的兄弟,它是具有alt属性的img。不过,我认为你想要的正确语法只是img[@alt]

下一个你说它不会编译的问题,检查错误信息,它可能会抱怨回参数类型。 sellers.Add我想要命名另一个HtmlNode,而不是添加内部表达式返回的属性。

此外,请查看Html Agility pack文档和其他有关语法的问题。