2011-11-13 35 views
6

Tôi đang cố gắng sử dụng gói Nhanh nhẹn HTML để loại bỏ một số dữ liệu từ một trang web. Tôi thực sự đấu tranh trong việc tìm ra cách sử dụng các selectnodes bên trong một foreach và sau đó xuất dữ liệu vào một danh sách hoặc một mảng.Gói Agility HTML Chọn các nút

Đây là mã tôi đang làm việc cho đến thời điểm này.

 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. 

     } 

Tôi có nhận xét trong đoạn mã ở trên cho thấy những gì hiệu quả và những gì không và loại thứ tôi muốn hoàn thành.

Nếu có ai có bất kỳ đề xuất hoặc lần đọc nào tuyệt vời! Tôi đã tìm kiếm các diễn đàn và ví dụ và không đi qua bất cứ điều gì mà tôi có thể sử dụng.

Trả lời

11

Vấn đề đầu tiên của bạn với nhận xét ra SelectNodes không hoạt động vì 'id' không phải là tên phần tử, đó là tên thuộc tính. Bạn đã sử dụng đúng cú pháp trong các biểu thức khác của bạn để chọn thuộc tính và so sánh giá trị. Ví dụ: //ElementName[@attributeName='value']. Tôi nghĩ rằng thậm chí [attributeName='value'] sẽ hoạt động, nhưng tôi chưa thử nghiệm điều này.

Cú pháp bên trong hàm SelectNodes được gọi là "XPath". This link có thể giúp bạn.

Nút seller bạn đang chọn là anh chị em của node cho lần lặp hiện tại là img với thuộc tính alt. Tuy nhiên tôi nghĩ cú pháp chính xác bạn muốn chỉ là img[@alt].

Vấn đề tiếp theo mà bạn nói nó sẽ không biên dịch, kiểm tra thông báo lỗi, nó có thể sẽ phàn nàn về các loại đối số. sellers.Add Tôi nghĩ là tìm cách đặt tên cho một HtmlNode khác, không phải là thuộc tính mà biểu thức bên trong phần bổ sung đang trả về.

Ngoài ra, hãy xem tài liệu Gói nhanh nhẹn Html và các câu hỏi khác liên quan đến cú pháp.

Các vấn đề liên quan