2012-02-15 49 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界面)。看看使用此功能玩的新测试版