我在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="" />
<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&&" title="interner Link: Information zu dieser Haltestelle">S Mahlsdorf</a>
我想知道的是“12:05”,“398路公交车”和“S Mahlsdorf”。通过前两部分,我可以使用以下代码:
Regex HTMLTag = new Regex("ivu_table_c_dep\">([^<>]*)</td>([^<>]*)<td class=\"ivu_table_c_line\">([^<>]*)</td>");
但我没有得到3.部分。我试图添加“([^(\”&gt;)] )([^&lt;&gt;] )“。但它不起作用。
答案 0 :(得分:1)
使用HTML Agility Pack解析和查询HTML而不是正则表达式 - 请参阅this answer,了解为什么Regex解析HTML的解决方案很差。
这是一个敏捷的HTML解析器,它构建一个读/写DOM并支持普通的XPATH或XSLT(你实际上不需要理解XPATH或XSLT来使用它,不用担心......)。它是一个.NET代码库,允许您解析“out of the web”HTML文件。解析器非常容忍“真实世界”格式错误的HTML。对象模型与提出System.Xml非常相似,但对于HTML文档(或流)。
Html Agility Pack现在支持Linq to Objects(通过LINQ to Xml Like界面)。查看要使用此功能的新测试版
答案 1 :(得分: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