2012-02-15 62 views
0

我在C#中遇到了正則表達式的問題。我想分析一個簡單的網頁的HTML代碼。它看起來像這樣:C#使用正則表達式分析html代碼

<td class="ivu_table_c_dep"> 12:05 </td> 
<td class="ivu_table_c_line"> Bus 398 </td> 
<td> 
<img src="/IstAbfahrtzeiten/img/css/link.gif" alt="" />&nbsp; 
    <a class="catlink" href="http://mobil.bvg.de/Fahrinfo/bin/stboard.bin/dox?boardType=dep&input=S Mahlsdorf!&time=12:05&date=15.02.2012&&amp;" title="interner Link: Information zu dieser Haltestelle">S Mahlsdorf</a> 

我想知道的是「12:05」,「巴士398」和「S Mahlsdorf」。隨着第2個部分,我得到它與下面的代碼工作:

Regex HTMLTag = new Regex("ivu_table_c_dep\">([^<>]*)</td>([^<>]*)<td class=\"ivu_table_c_line\">([^<>]*)</td>"); 

但我不明白的3部分。我嘗試添加 「([^(\」>)] )([^ <>])」但它doesnt't工作

+1

強制性:http://stackoverflow.com/questions/677038/how-to-use-regular-expressions-to -parse-html-in-java – Oded 2012-02-15 10:59:48

+1

更強制性的:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – 2012-02-15 11:24:35

回答

0

當您知道文本的結構時,使用正則表達式作爲快速和骯髒的解決方案是可以的。畢竟,人們在這裏克隆通過序列化和反序列化他們... 對象你會用小助手功能更好的,像這樣的:

static string gettext(string text, string tag, string cl) { 
    string re = string.Format(@"<\s*{0}[^>]+?class\s*=\s*[""']?{1}[^>]*>([^<]*)", tag, cl); 
    return Regex.Match(text, re).Groups[1].Value; 
} 

脆弱,但它仍然可以在簡單的情況下使用,像你的。它提取從給定的標籤文本(第一文本節點,實際上)與給定類:

Console.WriteLine(gettext(text, "td", "ivu_table_c_dep")); // 12:05 
Console.WriteLine(gettext(text, "td", "ivu_table_c_line")); // Bus 398 
Console.WriteLine(gettext(text, "a", "catlink"));   // S Mahlsdorf 
1

使用HTML Agility Pack分析和查詢HTML而不是正則表達式。 - 看到this answer一個令人信服的理由,爲什麼正則表達式是一個貧窮的解決方案,一般解析HTML。

這是一個靈活的HTML解析器,建立一個讀/寫DOM和支持純XPath或XSLT(你居然沒有理解XPATH和XSLT來使用它,別擔心......)它是一個.NET代碼庫,它允許你解析「離開網頁」的HTML文件,解析器對「真實世界」格式錯誤非常寬容HTML。對象模型與wha非常相似t建議System.Xml,但對於HTML文檔(或流)。

Html Agility Pack現在支持Linq to Objects(通過LINQ to Xml Like界面)。看看使用此功能玩的新測試版