2011-12-13 35 views
9

Làm thế nào tôi có hiệu quả phân tích giá trị thuộc tính href từ này:HTML Agility Pack: phân tích thẻ href

<tr> 
<td rowspan="1" colspan="1">7</td> 
<td rowspan="1" colspan="1"> 
<a class="undMe" href="/ice/player.htm?id=8475179" rel="skaterLinkData" shape="rect">D. Kulikov</a> 
</td> 
<td rowspan="1" colspan="1">D</td> 
<td rowspan="1" colspan="1">0</td> 
<td rowspan="1" colspan="1">0</td> 
<td rowspan="1" colspan="1">0</td> 
[...] 

Tôi quan tâm đến việc có id cầu thủ, đó là: 8.475.179 Đây là mã tôi cho đến nay:

 // Iterate all rows (players) 
     for (int i = 1; i < rows.Count; ++i) 
     { 
      HtmlNodeCollection cols = rows[i].SelectNodes(".//td"); 

      // new player 
      Dim_Player player = new Dim_Player(); 

       // Iterate all columns in this row 
       for (int j = 1; j < 6; ++j) 
       { 
        switch (j) { 
         case 1: player.Name = cols[j].InnerText; 
           player.Player_id = Int32.Parse(/* this is where I want to parse the href value */); 
           break; 
         case 2: player.Position = cols[j].InnerText; break; 
         case 3: stats.Goals = Int32.Parse(cols[j].InnerText); break; 
         case 4: stats.Assists = Int32.Parse(cols[j].InnerText); break; 
         case 5: stats.Points = Int32.Parse(cols[j].InnerText); break; 
        } 
       } 
+0

Nếu bạn đã mã hoá cứng chỉ trong 'switch', tại sao bạn sẽ sử dụng 'for' vòng lặp? Tại sao không phải 'player.Position = cols [2] .InnerText;' –

+0

Điểm tốt. Tôi tái chế một số mã cũ tôi đã viết, vì vậy tôi đã không nghĩ về điều đó. –

Trả lời

20

Dựa trên ví dụ của bạn này làm việc cho tôi:

HtmlDocument htmlDoc = new HtmlDocument(); 
htmlDoc.Load("test.html"); 
var link = htmlDoc.DocumentNode 
        .Descendants("a") 
        .First(x => x.Attributes["class"] != null 
          && x.Attributes["class"].Value == "undMe"); 

string hrefValue = link.Attributes["href"].Value; 
long playerId = Convert.ToInt64(hrefValue.Split('=')[1]); 

Đối với sử dụng thực tế bạn cần phải thêm kiểm tra lỗi, vv

+0

Làm việc cho tôi! Có phải chỉ là tôi hay điều này khá bất tiện vì chúng ta phải sử dụng 'htmlDoc' trong đó chúng ta tìm thấy tất cả các nút với lớp 'undMe', trong khi thay vào đó chúng ta có thể sử dụng' cols [j] 'có' href' trong nó là InnerHtml? –

+0

Bạn đang tạo một giả định rất mạnh về vị trí của liên kết - điều này có thể hoạt động tốt nhưng rất cứng nhắc và sẽ bị ngắt, tức là nếu bạn thêm một cột khác. Cách tiếp cận được trình bày sẽ không vì truy vấn * của nó cho liên kết trên các giả định tối thiểu – BrokenGlass

+0

Thực ra, vấn đề duy nhất với điều này là 'First()' là tĩnh và luôn mang yếu tố đầu tiên mà anh ta tìm thấy. Tôi cần một cái gì đó năng động mà có thể nhận được các yếu tố thực tế. –

2

Sử dụng một biểu thức XPath để tìm thấy nó:

foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@class='undMe']")) 
{ 
     HtmlAttribute att = link.Attributes["href"]; 
     Console.WriteLine(new Regex(@"(?<=[\?&]id=)\d+(?=\&|\#|$)").Match(att.Value).Value); 
} 
Các vấn đề liên quan