请教正则表达式

snowbirdfly 2009-05-13 08:19:20
我获取到某个网页的HTML代码,例如:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">




<head>
<title>
...(省略)
<ul class="shop-list">
<li>
<h4>
<a target="_blank" href="http://item.taobao.com/auction/item_detail-0db1-91ea75432fd891a8e003b4a984c92d44.htm">
<<中文版3ds Max 8家居效果图设计完全攻略>>随书光盘
</a>
</h4>
<div class="item">
<div class="pic"> <a title="<<中文版3ds Max 8家居效果图设计完全攻略>>随书光盘" href="http://item.taobao.com/auction/item_detail-0db1-91ea75432fd891a8e003b4a984c92d44.htm" target="_blank">
<img src="http://img03.taobaocdn.com/bao/uploaded/i3/20071205/911/T1z50aXmY0gky9Tz.7_065338.jpg_sum.jpg"/>
</a>
</div>
</div>
</li>
</ul>
...(省略)

请问如何我忽略前面不关心的数据,获取到
http://item.taobao.com/auction/item_detail-0db1-91ea75432fd891a8e003b4a984c92d44.htm
<<中文版3ds Max 8家居效果图设计完全攻略>>随书光盘
http://img03.taobaocdn.com/bao/uploaded/i3/20071205/911/T1z50aXmY0gky9Tz.7_065338.jpg_sum.jpg
这几个关键的数据,System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex()?.
谢谢.
...全文
139 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
snowbirdfly 2009-05-14
  • 打赏
  • 举报
回复
问题解决了,谢谢~~~
snowbirdfly 2009-05-13
  • 打赏
  • 举报
回复
恩,很感谢楼上的哥们热心帮忙~~~
-过客- 2009-05-13
  • 打赏
  • 举报
回复
具体问题具体分析,效率有开发效率和执行效率,要看处理对象的大小,复杂度等等,还要看知识的掌握程度

对于我来说,这种问题我会毫不犹豫的选择正则,因为基本上不占用开发时间,呵呵

Regex regUl = new Regex(@"<ul\s+class=""shop-list"">(?>(?:(?!</?ul\b).)*)</ul>", RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Compiled);
Regex regCon = new Regex(@"<a\s+title=""(?<title>[^""]*)""\s+href=""(?<url>[^""]*)""[^>]*>\s*<img\s+src=""(?<src>[^""]*)""[^>]*>\s*</a>", RegexOptions.IgnoreCase | RegexOptions.Compiled);
Match mUl = regUl.Match(yourStr);
if (mUl.Success)
{
Match mCon = regCon.Match(mUl.Value);
if(mCon.Success)
{
richTextBox2.Text += mCon.Groups["title"].Value + "\n";
richTextBox2.Text += mCon.Groups["url"].Value + "\n";
richTextBox2.Text += mCon.Groups["src"].Value + "\n";
}
}


正则并不代表低的执行效率,要看正则写出的正则和使用的方式
snowbirdfly 2009-05-13
  • 打赏
  • 举报
回复
恩,谢谢10楼热心回答,主要是数据是HTML数据,不是XML,HTML随意性比较大,所以.net里面没有像

WebResponse resp = myWebRequest.GetResponse();
Stream stream = resp.GetResponseStream();
XmlTextReader reader = new XmlTextReader(stream);
reader.XmlResolver = null; // ignore the DTD
reader.WhitespaceHandling = WhitespaceHandling.None;

所以,处理这个问题,还是利用正则表达式来判断,这个我也是从网上找了很多资料获知的,呵呵~~~
snowbirdfly 2009-05-13
  • 打赏
  • 举报
回复
恩,可能我没有说清楚,实际上我只关心整个HTML里面其中的一部分数据:

<ul class="shop-list">
<li>
<h4>
<a target="_blank" href="http://item.taobao.com/auction/item_detail-0db1-91ea75432fd891a8e003b4a984c92d44.htm">
<<中文版3ds Max 8家居效果图设计完全攻略>>随书光盘
</a>
</h4>
<div class="item">
<div class="pic"> <a title="<<中文版3ds Max 8家居效果图设计完全攻略>>随书光盘" href="http://item.taobao.com/auction/item_detail-0db1-91ea75432fd891a8e003b4a984c92d44.htm" target="_blank">
<img src="http://img03.taobaocdn.com/bao/uploaded/i3/20071205/911/T1z50aXmY0gky9Tz.7_065338.jpg_sum.jpg"/>
</a>
</div>
</div>
</li>
</ul>

具体的数据就是刚才所说的数据,那么我处理的话,可能就是先判断到该数据的开始部分,然后判断什么地方结束,然后获取直接的数据部分,利用正则表达式来从该部分数据来获取自己想获取的数据~~~
不知道这样效率怎么样,用DOM的话,每个都处理的话,大部分数据不关心,这样会不会影响效率?
jimmyroc 2009-05-13
  • 打赏
  • 举报
回复
实际上,像你这种情况,使用正则表达式是很麻烦的,而且通用不好,容易出错,最近在做这个类似的,可以用xmldocument 类里的方法来解决,
首先可以用一段正则表达式来获取<ul class="shop-list"></ul> ,然后,用Xpath来去值,代码如下:

Regex reg=new Regex(@"<ul[^>]*?class=""shop-list""[^>]*>((?>(?<o><ul[^>]*>)|(?<-o></ul>)|(?:(?!</?ul)[\s\S]))*)(?(o)(?!))</ul>");
Match m=reg.match(htmlsrc);
string s="";
if(m.success)
s=m.group[0].value;
XmlDocument xm = new XmlDocument();
xm.LoadXml(s);
//
//后面可以用xmldocumen的一些方法来取值
//
XmlNodeList NodeList = xml.SelectNodes("ul/div");//这里XPath可以写上你的筛选条件,
foreach(XmlNode xn in NodeList)
{
//要存入到数据库或者数字等
}

-过客- 2009-05-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 snowbirdfly 的回复:]
呵呵,太感谢5楼的~~~
可能我没有说明白,就是这个网页的前面部分我不关心,应该直接判断到 <ul class="shop-list">
,这个地方,可能用字符串判断就可以,要么就是2楼的方法,用DOM 来做~~~
[/Quote]

那到了<ul class="shop-list"> 之后呢,比如这之后的代码中有不需要的<a...>...</a>,如何区分

如果能用DOM来处理,DOM会简单些,正则会灵活些
snowbirdfly 2009-05-13
  • 打赏
  • 举报
回复
呵呵,太感谢5楼的~~~
可能我没有说明白,就是这个网页的前面部分我不关心,应该直接判断到<ul class="shop-list">
,这个地方,可能用字符串判断就可以,要么就是2楼的方法,用DOM 来做~~~
liangzhl 2009-05-13
  • 打赏
  • 举报
回复
顶下
snowbirdfly 2009-05-13
  • 打赏
  • 举报
回复
再up下~~~
在线关注~~~
-过客- 2009-05-13
  • 打赏
  • 举报
回复
需求看起来不是很明确,根据什么来区分关心的和不关心的数据?

根据楼主的例子可以写出以下正则
MatchCollection mc = Regex.Matches(yourStr, @"<a\s+title=""(?<title>[^""]*)""\s+href=""(?<url>[^""]*)""[^>]*>\s*<img\s+src=""(?<src>[^""]*)""[^>]*>\s*</a>", RegexOptions.IgnoreCase);
foreach (Match m in mc)
{
richTextBox2.Text += m.Groups["title"].Value + "\n";
richTextBox2.Text += m.Groups["url"].Value + "\n";
richTextBox2.Text += m.Groups["src"].Value + "\n";
}


但是因为楼主的需求不是很明确,所以以上代码可能仅适用于这个例子,需要楼主更清楚的说明一下需求

如要提取的数据符合什么样的规律,哪一部分会变,哪一部分固定等等
wuyq11 2009-05-13
  • 打赏
  • 举报
回复
snowbirdfly 2009-05-13
  • 打赏
  • 举报
回复
谢谢,我看看~~~
cppfaq 2009-05-13
  • 打赏
  • 举报
回复
UP
不过窃以为DOM更合适
snowbirdfly 2009-05-13
  • 打赏
  • 举报
回复
最好能给点正则表达式公式,谢谢~~~
分数不够可以再加~~~

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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