2010-05-20 27 views
12

Tôi đang cố gắng sử dụng HtmlAgilityPack để kéo tất cả các liên kết từ một trang được chứa trong div được khai báo là <div class='content'> Tuy nhiên, khi tôi sử dụng mã bên dưới, tôi chỉ cần TẤT CẢ liên kết trên toàn bộ trang. Điều này không thực sự hợp lý với tôi vì tôi đang gọi SelectNodes từ nút con mà tôi đã chọn trước đó (khi được xem trong trình gỡ rối chỉ hiển thị HTML từ div cụ thể đó). Vì vậy, nó giống như nó sẽ trở lại nút rất gốc mỗi khi tôi gọi SelectNodes. Mã tôi sử dụng ở bên dưới:Chỉ chọn các mục trong một DIV cụ thể bằng cách sử dụng HtmlAgilityPack

HtmlWeb hw = new HtmlWeb(); 
HtmlDocument doc = hw.Load(@"http://example.com"); 
HtmlNode node = doc.DocumentNode.SelectSingleNode("//div[@class='content']"); 
foreach(HtmlNode link in node.SelectNodes("//a[@href]")) 
{ 
    Console.WriteLine(link.Value); 
} 

Đây có phải là hành vi mong đợi không? Và nếu có, làm cách nào để tôi làm điều tôi mong đợi?

Trả lời

18

này sẽ làm việc:

node.SelectNodes("a[@href]") 

Ngoài ra, bạn có thể làm điều đó trong một selector duy nhất:

doc.DocumentNode.SelectSingleNode("//div[@class='content']//a[@href]") 

Ngoài ra, lưu ý rằng link.Value không được định nghĩa cho HtmlNode, do đó, mã của bạn không' t biên dịch.

+0

Điều này dường như không đúng với XPath mà tôi biết, nhưng nó hoạt động. Tôi cũng thú nhận tôi đã sử dụng HtmlAgilityPack lần đầu tiên ngay bây giờ, để trả lời câu hỏi. Tôi không thể tìm thấy bất kỳ tài liệu ... – Kobi

+1

liên quan đến link.Value, tôi đã viết lại này từ bộ nhớ ... nó đã được prob InnerHtml hoặc một cái gì đó. Vì vậy, là // làm cho nó luôn luôn trở lại root? Tôi đã không nhận được ấn tượng đó từ tài liệu XPath về W3C –

+0

T của chiếc mũ khá ấn tượng từ bộ nhớ ... Dù sao, bạn nói đúng - XPath bắt đầu bằng '// 'nên tôn trọng bối cảnh của nó, theo như tôi biết. – Kobi

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