2011-10-23 49 views
0

當前代碼:我將如何使用正則表達式來獲取鏈接的一部分?

public static void WhoIsOnline(string worldName, WhoIsOnlineReceived callback) 
    { 
     string url = "http://www.tibia.com/community/?subtopic=worlds&world=" + worldName; 
     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 

     request.BeginGetResponse(delegate(IAsyncResult ar) 
     { 
      string html = GetHTML(ar); 

      MatchCollection matches = Regex.Matches(html, @"<TD WIDTH=70%><[^<]*>([^<]*)</A></TD><TD WIDTH=10%>([^<]*)</TD><TD WIDTH=20%>([^<]*)</TD></TR>"); 
      List<CharOnline> chars = new List<CharOnline>(matches.Count); 
      CharOnline co; 

      for(int i = 0; i < matches.Count; i++) 
      { 
       co = new CharOnline(); 
       co.Name = Prepare(matches[i].Groups[1].Value); 
       co.Level = int.Parse(matches[i].Groups[2].Value); 
       co.Vocation = Prepare(matches[i].Groups[3].Value); 
       chars.Add(co); 
      } 

      callback(chars); 
     }, request); 
    } 

我用這個刮在線列表,但他們已經改變了他們的佈局,我不知道如何改變正則表達式來獲得相同的信息。

http://www.tibia.com/community/?subtopic=worlds&world=Libera

我嘗試使用上面的鏈接。

+4

你爲什麼要使用正則表達式解析HTML?看一看[HTML Agility Pack](http://htmlagilitypack.codeplex.com/),它能夠以您所需的方式滿足您的需求,並以更強大的方式提供更多功能。 – Tomalak

+0

我試圖檢索玩家的名字,職業和等級。敏捷包將能夠做到這一點更容易? –

+0

@Ales是的。並具有防故障功能。更可維護(尤其是因爲正則表達式似乎不是你的強項)。可能即使是在較少的代碼行中。請參閱[此問題](http://stackoverflow.com/questions/846994/how-to-use-html-agility-pack)以概覽Agility Pack的工作原理。 – Tomalak

回答

0

正如其他人所說,正確的HTML解析更健壯,絕對是更好的方法。

然而,這應該工作:

MatchCollection matches = Regex.Matches(html, @"<a href="".*?subtopic=characters&name=.*?"".*?>(.*?)</a>.*?<td.*?>(\d+)</td><td.*?>(.*?)</td>); 
相關問題