2009-02-12 63 views
8

Tôi đang cố gắng để lấy một hình ảnh cụ thể từ một tài liệu html, sử dụng gói html sự nhanh nhẹn và xpath này:Lựa chọn thuộc tính giá trị với html Agility Pack

//div[@id='topslot']/a/img/@src 

Theo như tôi thấy, nó tìm thấy src -vị trí, nhưng nó trả về thẻ img. Tại sao vậy?

Tôi mong đợi InnerHtml/InnerText hoặc thứ gì đó sẽ được đặt, nhưng cả hai đều là chuỗi rỗng. OuterHtml được đặt thành thẻ img hoàn chỉnh.

Có tài liệu nào cho Gói Agility Html không?

Trả lời

11

Gói nhanh nhạy Html does not support lựa chọn thuộc tính.

+5

Tôi vừa sử dụng nó để chọn tất cả các div nơi căn chỉnh thuộc tính được đặt ở giữa. "// div [@ align = 'center']" – clamchoda

+0

Có thể giải quyết một chút, vui lòng xem câu trả lời của tôi bên dưới. –

15

Bạn có thể trực tiếp lấy các thuộc tính nếu bạn sử dụng HtmlNavigator để thay thế.

//Load document from some html string 
HtmlDocument hdoc = new HtmlDocument(); 
hdoc.LoadHtml(htmlContent); 

//Load navigator for current document 
HtmlNodeNavigator navigator = (HtmlNodeNavigator)hdoc.CreateNavigator(); 

//Get value from given xpath 
string xpath = "//div[@id='topslot']/a/img/@src"; 
string val = navigator.SelectSingleNode(xpath).Value; 
+1

Trong khi điều này làm việc để đọc giá trị của thuộc tính thì không thể sửa đổi nó. Gọi '.SetValue (" new_value ")' trên nút thuộc tính đã chọn sẽ ném ra 'System.NotSupportedException' vì' HtmlNodeNavigator' được trả về là ** chỉ đọc **. – Andre

+0

Câu trả lời này không phải là mâu thuẫn trực tiếp với câu trả lời được chấp nhận (sửa đổi không phải là một phần của câu hỏi)? –

+0

@DavidS.Tôi đoán OP chỉ không bao giờ bận tâm chuyển đổi nó kể từ khi tôi thêm câu trả lời này khoảng 4 năm sau –

7

Bạn có thể sử dụng phương thức "GetAttributeValue".

Ví dụ:

//[...] code before needs to load a html document 
HtmlAgilityPack.HtmlDocument htmldoc = e.Document; 
//get all nodes "a" matching the XPath expression 
HtmlNodeCollection AllNodes = htmldoc.DocumentNode.SelectNodes("*[@class='item']/p/a"); 
//show a messagebox for each node found that shows the content of attribute "href" 
foreach (var MensaNode in AllNodes) 
{ 
    string url = MensaNode.GetAttributeValue("href", "not found"); 
    MessageBox.Show(url); 
} 
1

Đọc và Viết Thuộc tính với Html Agility Pack

Bạn có thể vừa đọc và thiết lập các thuộc tính trong HtmlAgilityPack. Ví dụ này chọn thẻ < html> và chọn thuộc tính 'lang' (ngôn ngữ) nếu nó tồn tại và sau đó đọc và ghi vào thuộc tính 'lang'.

Trong ví dụ bên dưới, doc.LoadHtml (this.All), "this.All" là biểu diễn chuỗi của tài liệu html.

Đọc và viết:

  HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
      doc.LoadHtml(this.All); 
      string language = string.Empty; 
      var nodes = doc.DocumentNode.SelectNodes("//html"); 
      for (int i = 0; i < nodes.Count; i++) 
      { 
       if (nodes[i] != null && nodes[i].Attributes.Count > 0 && nodes[i].Attributes.Contains("lang")) 
       { 
        language = nodes[i].Attributes["lang"].Value; //Get attribute 
        nodes[i].Attributes["lang"].Value = "en-US"; //Set attribute 
       } 
      } 

chỉ đọc:

  HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
      doc.LoadHtml(this.All); 
      string language = string.Empty; 
      var nodes = doc.DocumentNode.SelectNodes("//html"); 
      foreach (HtmlNode a in nodes) 
      { 
       if (a != null && a.Attributes.Count > 0 && a.Attributes.Contains("lang")) 
       { 
        language = a.Attributes["lang"].Value; 
       } 
      } 
0

tôi đã sử dụng cách sau để có được các thuộc tính của một hình ảnh.

var MainImageString = MainImageNode.Attributes.Where(i=> i.Name=="src").FirstOrDefault(); 

Bạn có thể chỉ định tên thuộc tính để nhận giá trị; nếu bạn không biết tên thuộc tính, hãy cung cấp một điểm ngắt sau khi bạn đã tìm nạp nút và xem các thuộc tính của nó bằng cách di chuột qua nó.

Hy vọng tôi đã giúp.

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