正则表达式匹配html

NetAnt007 2011-08-31 11:30:02
<table width="880" border="0" cellpadding="5" cellspacing="1" bgcolor="#EAEAEA">
<tr>
<th width="86" bgcolor="#EFEFEF">货币名称</th>
<th width="86" bgcolor="#EFEFEF">现汇买入价</th>
<th width="86" bgcolor="#EFEFEF">现钞买入价</th>
<th width="86" bgcolor="#EFEFEF">卖出价</th>
<th width="86" bgcolor="#EFEFEF">基准价</th>
<th width="86" bgcolor="#EFEFEF">中行折算价</th>
<th width="86" bgcolor="#EFEFEF">发布日期</th>
<th width="86" bgcolor="#EFEFEF">发布时间</th>
</tr>
<tr align="center">
<td bgcolor="#FFFFFF">英镑</td>
<td bgcolor="#FFFFFF">1033.91</td>
<td bgcolor="#FFFFFF">1001.99</td>
<td bgcolor="#FFFFFF">1042.22</td>
<td bgcolor="#FFFFFF">1041.77</td>
<td bgcolor="#FFFFFF">1041.77</td>
<td bgcolor="#FFFFFF">2011-08-31</td>
<td bgcolor="#FFFFFF">17:08:55</td>
</tr>
<tr align="center">
<td bgcolor="#FFFFFF">港币</td>
<td bgcolor="#FFFFFF">81.65</td>
<td bgcolor="#FFFFFF">81</td>
<td bgcolor="#FFFFFF">81.96</td>
<td bgcolor="#FFFFFF">81.92</td>
<td bgcolor="#FFFFFF">81.92</td>
<td bgcolor="#FFFFFF">2011-08-31</td>
<td bgcolor="#FFFFFF">17:08:55</td>
</tr>
<tr align="center">
<td bgcolor="#FFFFFF">美元</td>
<td bgcolor="#FFFFFF">636.35</td>
<td bgcolor="#FFFFFF">631.24</td>
<td bgcolor="#FFFFFF">638.9</td>
<td bgcolor="#FFFFFF">638.67</td>
<td bgcolor="#FFFFFF">638.67</td>
<td bgcolor="#FFFFFF">2011-08-31</td>
<td bgcolor="#FFFFFF">17:08:55</td>
</tr>
</table>

如上的html 我如何用正则表达式提取出每个<tr>的数据。
...全文
220 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
NetAnt007 2011-09-01
  • 打赏
  • 举报
回复
protected void Page_Load(object sender, EventArgs e)
{
string strTemp = Http.DownLoadData(@"http://www.boc.cn/sourcedb/whpj/index.html", Encoding.GetEncoding("UTF-8"));
//string strReg = @"(?is)<td[^>]+>(?<content>[^<]+)</td>";
string strReg = @"(?is)(?<=<tr[^>]*?>)\s*?<td[^>]*?>.*?</td>(?:\s*?<td\s*?bgcolor=""#FFFFFF""\s*>(.*?)</td>)*\s*(?=</tr>)";
Regex re = new Regex(strReg, RegexOptions.IgnoreCase | RegexOptions.Singleline);
foreach (Match m in re.Matches(strTemp))
{
Response.Write(m.Groups[1].Value);
Response.Write("<br>");
}

Response.End();
}

public static string DownLoadData(string strURL, Encoding oDownLoadDataEncoding)
{
string _EncodingName = oDownLoadDataEncoding.CodePage.ToString();

return DownLoadData(strURL, _EncodingName);
}

public static string DownLoadData(string strURL, string DownLoadDataEncodingName)
{
byte[] _pageData = null;
string _pageHtml = "";

System.Net.WebClient _WebClient = new System.Net.WebClient();
_pageData = _WebClient.DownloadData(@strURL);
_WebClient.Dispose();
_pageHtml = Encoding.GetEncoding(int.Parse(DownLoadDataEncodingName)).GetString(_pageData);
return _pageHtml;
}
NetAnt007 2011-09-01
  • 打赏
  • 举报
回复

protected void Page_Load(object sender, EventArgs e)
{
string strTemp = Http.DownLoadData(@"http://www.boc.cn/sourcedb/whpj/index.html", Encoding.GetEncoding("UTF-8"));
//string strReg = @"(?is)<td[^>]+>(?<content>[^<]+)</td>";
string strReg = @"(?is)(?<=<tr[^>]*?>)\s*?<td[^>]*?>.*?</td>(?:\s*?<td\s*?bgcolor=""#FFFFFF""\s*>(.*?)</td>)*\s*(?=</tr>)";
Regex re = new Regex(strReg, RegexOptions.IgnoreCase | RegexOptions.Singleline);
foreach (Match m in re.Matches(strTemp))
{
Response.Write(m.Groups[1].Value);
Response.Write("<br>");
}

Response.End();
}

public static string DownLoadData(string strURL, Encoding oDownLoadDataEncoding)
{
string _EncodingName = oDownLoadDataEncoding.CodePage.ToString();

return DownLoadData(strURL, _EncodingName);
}

public static string DownLoadData(string strURL, string DownLoadDataEncodingName)
{
byte[] _pageData = null;
string _pageHtml = "";

System.Net.WebClient _WebClient = new System.Net.WebClient();
_pageData = _WebClient.DownloadData(@strURL);
_WebClient.Dispose();
_pageHtml = Encoding.GetEncoding(int.Parse(DownLoadDataEncodingName)).GetString(_pageData);
return _pageHtml;
}
ycproc 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 huangwenquan123 的回复:]

喔 看了下,修改了下。
C# code

string str = File.ReadAllText(@"E:\txt.txt", Encoding.GetEncoding("gb2312"));//换成你的字符串
Regex reg = new Regex(@"(?is)(?<=<tr[^>]*?>)\s*?<td[^>]*?>.*?</td>……
[/Quote]

正则都他妈好强大
NetAnt007 2011-09-01
  • 打赏
  • 举报
回复
恩,奇怪,我是用webclient DownloadData url 得到的html进行转换的,可能有些不同?
我也用控制台实验了一下,确实和你的一样,但是货币名称怎么没有了?
huangwenquan123 2011-09-01
  • 打赏
  • 举报
回复
不会啊,我出来的是这样的。我是在你提供的那个网址直接匹配它页面的全部html代码得到这个结果。
NetAnt007 2011-09-01
  • 打赏
  • 举报
回复
楼上的,不行哦。
出来全是
00:00:05
00:00:05
00:00:05
00:00:05
00:00:05
00:00:05
00:00:05
00:00:05
00:00:05
00:00:05
00:00:05
00:00:05
00:00:05
00:00:05
00:00:05
00:00:05
00:00:05
00:00:05

huangwenquan123 2011-09-01
  • 打赏
  • 举报
回复
喔 看了下,修改了下。

string str = File.ReadAllText(@"E:\txt.txt", Encoding.GetEncoding("gb2312"));//换成你的字符串
Regex reg = new Regex(@"(?is)(?<=<tr[^>]*?>)\s*?<td[^>]*?>.*?</td>(?:\s*?<td\s*?bgcolor=""#FFFFFF""\s*>(.*?)</td>)*\s*(?=</tr>)");
foreach (Match m in reg.Matches(str))
{
foreach (Capture c in m.Groups[1].Captures)
Console.WriteLine(c.Value);
}
诺维斯基 2011-09-01
  • 打赏
  • 举报
回复
huangwenquan123 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 netant007 的回复:]
恩,奇怪,我是用webclient DownloadData url 得到的html进行转换的,可能有些不同?
我也用控制台实验了一下,确实和你的一样,但是货币名称怎么没有了?
[/Quote]我还以为你货币名称不要,就没弄上
现在弄上了
            string str = File.ReadAllText(@"E:\1.txt", Encoding.GetEncoding("gb2312"));//换成你的字符串
Regex reg = new Regex(@"(?is)(?<=<tr[^>]*?>)(?:\s*?<td\s*?bgcolor=""#FFFFFF""\s*>(.*?)</td>)*\s*(?=</tr>)");
foreach (Match m in reg.Matches(str))
{
foreach (Capture c in m.Groups[1].Captures)
Console.WriteLine(c.Value);
}
NetAnt007 2011-08-31
  • 打赏
  • 举报
回复
我其实是取
http://www.boc.cn/sourcedb/whpj/index.html
这个网址上的各个货币的报价信息。
上面两位运行我给的html是正确的,但是如果套用全部的代码,
ustbwuyi 前面多了几个nbsp;

huangwenquan123 会匹配的多出一些东西,

在帮我改改。谢谢。
huangwenquan123 2011-08-31
  • 打赏
  • 举报
回复
第一个td标题不取

string str = @"<table width=""880"" border=""0"" cellpadding=""5"" cellspacing=""1"" bgcolor=""#EAEAEA"">
<tr>
<th width=""86"" bgcolor=""#EFEFEF"">货币名称</th>
<th width=""86"" bgcolor=""#EFEFEF"">现汇买入价</th>
<th width=""86"" bgcolor=""#EFEFEF"">现钞买入价</th>
<th width=""86"" bgcolor=""#EFEFEF"">卖出价</th>
<th width=""86"" bgcolor=""#EFEFEF"">基准价</th>
<th width=""86"" bgcolor=""#EFEFEF"">中行折算价</th>
<th width=""86"" bgcolor=""#EFEFEF"">发布日期</th>
<th width=""86"" bgcolor=""#EFEFEF"">发布时间</th>
</tr>
<tr align=""center"">
<td bgcolor=""#FFFFFF"">英镑</td>
<td bgcolor=""#FFFFFF"">1033.91</td>
<td bgcolor=""#FFFFFF"">1001.99</td>
<td bgcolor=""#FFFFFF"">1042.22</td>
<td bgcolor=""#FFFFFF"">1041.77</td>
<td bgcolor=""#FFFFFF"">1041.77</td>
<td bgcolor=""#FFFFFF"">2011-08-31</td>
<td bgcolor=""#FFFFFF"">17:08:55</td>
</tr>
<tr align=""center"">
<td bgcolor=""#FFFFFF"">港币</td>
<td bgcolor=""#FFFFFF"">81.65</td>
<td bgcolor=""#FFFFFF"">81</td>
<td bgcolor=""#FFFFFF"">81.96</td>
<td bgcolor=""#FFFFFF"">81.92</td>
<td bgcolor=""#FFFFFF"">81.92</td>
<td bgcolor=""#FFFFFF"">2011-08-31</td>
<td bgcolor=""#FFFFFF"">17:08:55</td>
</tr>
<tr align=""center"">
<td bgcolor=""#FFFFFF"">美元</td>
<td bgcolor=""#FFFFFF"">636.35</td>
<td bgcolor=""#FFFFFF"">631.24</td>
<td bgcolor=""#FFFFFF"">638.9</td>
<td bgcolor=""#FFFFFF"">638.67</td>
<td bgcolor=""#FFFFFF"">638.67</td>
<td bgcolor=""#FFFFFF"">2011-08-31</td>
<td bgcolor=""#FFFFFF"">17:08:55</td>
</tr>
</table>";
Regex reg = new Regex(@"(?is)(?<=<tr[^>]*?>)\s*?<td[^>]*?>.*?</td>(?:\s*?<td[^>]*?>(.*?)</td>)*\s*(?=</tr>)");
foreach (Match m in reg.Matches(str))
{
foreach (Capture c in m.Groups[1].Captures)
Console.WriteLine(c.Value);
Console.WriteLine();
}
ustbwuyi 2011-08-31
  • 打赏
  • 举报
回复

string source = @"<table width=""880"" border=""0"" cellpadding=""5"" cellspacing=""1"" bgcolor=""#EAEAEA"">
<tr>
<th width=""86"" bgcolor=""#EFEFEF"">货币名称</th>
<th width=""86"" bgcolor=""#EFEFEF"">现汇买入价</th>
<th width=""86"" bgcolor=""#EFEFEF"">现钞买入价</th>
<th width=""86"" bgcolor=""#EFEFEF"">卖出价</th>
<th width=""86"" bgcolor=""#EFEFEF"">基准价</th>
<th width=""86"" bgcolor=""#EFEFEF"">中行折算价</th>
<th width=""86"" bgcolor=""#EFEFEF"">发布日期</th>
<th width=""86"" bgcolor=""#EFEFEF"">发布时间</th>
</tr>
<tr align=""center"">
<td bgcolor=""#FFFFFF"">英镑</td>
<td bgcolor=""#FFFFFF"">1033.91</td>
<td bgcolor=""#FFFFFF"">1001.99</td>
<td bgcolor=""#FFFFFF"">1042.22</td>
<td bgcolor=""#FFFFFF"">1041.77</td>
<td bgcolor=""#FFFFFF"">1041.77</td>
<td bgcolor=""#FFFFFF"">2011-08-31</td>
<td bgcolor=""#FFFFFF"">17:08:55</td>
</tr>
<tr align=""center"">
<td bgcolor=""#FFFFFF"">港币</td>
<td bgcolor=""#FFFFFF"">81.65</td>
<td bgcolor=""#FFFFFF"">81</td>
<td bgcolor=""#FFFFFF"">81.96</td>
<td bgcolor=""#FFFFFF"">81.92</td>
<td bgcolor=""#FFFFFF"">81.92</td>
<td bgcolor=""#FFFFFF"">2011-08-31</td>
<td bgcolor=""#FFFFFF"">17:08:55</td>
</tr>
<tr align=""center"">
<td bgcolor=""#FFFFFF"">美元</td>
<td bgcolor=""#FFFFFF"">636.35</td>
<td bgcolor=""#FFFFFF"">631.24</td>
<td bgcolor=""#FFFFFF"">638.9</td>
<td bgcolor=""#FFFFFF"">638.67</td>
<td bgcolor=""#FFFFFF"">638.67</td>
<td bgcolor=""#FFFFFF"">2011-08-31</td>
<td bgcolor=""#FFFFFF"">17:08:55</td>
</tr>
</table>";
string patten = @"(?is)<td[^>]+>(?<content>[^<]+)</td>";
Regex reg = new Regex(patten);
MatchCollection collection = reg.Matches(source);
MessageBox.Show(collection.Count.ToString());
if (collection.Count > 0)
{
foreach (Match m in collection)
{
MessageBox.Show(m.Groups["content"].Value);

}
}
else
{
MessageBox.Show("No Match");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
NetAnt007 2011-08-31
  • 打赏
  • 举报
回复
其实我就是想抽取出tr里面的有数据的项,第一行是标题,可以不用取。
NetAnt007 2011-08-31
  • 打赏
  • 举报
回复
不用,只要匹配出td的数据就行。
ustbwuyi 2011-08-31
  • 打赏
  • 举报
回复
每个tr的数据?th和td标签要取出来么?

62,268

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧