用于html解析的正则表达式(在c#中)

时间:2008-11-07 10:50:30

标签: c# html regex parsing

我正在尝试解析html页面并从表格行中提取2个值。 表格行的html如下: -

<tr>
<td title="Associated temperature in (ºC)" class="TABLEDATACELL" nowrap="nowrap" align="Left" colspan="1" rowspan="1">Max Temperature (ºC)</td>
<td class="TABLEDATACELLNOTT" nowrap="nowrap" align="Center" colspan="1" rowspan="1">6</td>
<td class="TABLEDATACELLNOTT" nowrap="nowrap" align="Center" colspan="1" rowspan="1"> 13:41:30</td>
</tr>

我现在的表达是:

<tr>[\s]<td[^<]+?>Max Temperature[\w\s]*</td>[\s]
<td[^<]+?>(?<value>([\d]+))</td>[\s]
<td[^<]+?>(?<time>([\d\:]+))</td>[\s]</tr>

但是我似乎无法提取任何匹配项。 任何人都可以指出我正确的方向,谢谢。

7 个答案:

答案 0 :(得分:4)

众所周知,使用regexp可靠地解析HTML是非常困难的。

我想我会寻找一个HTML解析库,或者一个“屏幕抓取”库;)

如果HTML来自不可靠的来源,则必须格外小心处理恶意HTML语法。糟糕的HTML处理是安全攻击的主要来源。

答案 1 :(得分:1)

尝试

<tr>\s*
<td[^>]*>.*?</td>\s*
<td[^>]*>\s*(?<value>\d+)\s*</td>\s*
<td[^>]*>\s*(?<time>\d{2}:\d{2}:\d{2})\s*</td>\s*
</tr>\s*

答案 2 :(得分:0)

当你写<td[^<]+?>时,我猜你的意思是<td[^>]*>

那是“开口大括号,td,也许不是关闭大括号......”

答案 3 :(得分:0)

<tr>[\s]<td[^<]+?>Max Temperature[\w\s]*</td>[\s]

还没有看完它,但是当你试图匹配所有非&gt;时,[^&lt;]可能需要[^&gt;]。直到&gt;那是在Max温度之前。

答案 4 :(得分:0)

关闭td之前的“(ºC)”匹配:

<tr>[\s]<td[^<]+?>Max Temperature[^<]*</td>[\s]

这是一个字边界吗?我认为那里有点棘手,我会采用更通用的方法。

在第三行,td标签后面有一个空格,是否占了?

<td[^<]+?>[\s]?(?<time>([\d\:]+))</td>[\s]</tr>

答案 5 :(得分:0)

我使用http://www.regexbuddy.com/进行此类控制。 到目前为止,我测试了@ sgehrig的建议是正确的

答案 6 :(得分:0)

使用Html Agility Pack或类似的库,正如@Bjarke Ebert建议的那样。这是完成任务的正确工具。