C#.net正则表达式提取网页URL问题

现在利用C#写了一个程序,可以获取网页的源码。但是现在还面临一个问题,就是怎么样快速有效的提取一个网页的源码中所有的<a href="URL"/></a>这样的标记中,所有的URL。
我自己写了一个,效率比较低。想问一下各位有什么好的方法没有。
最好是能用一个效率比较高的方法或者什么能一下子提取出所有的URL
有没有解决方案
我知道正则表达式怎么写。重要是代码怎么实现的部分~在c#中怎么来实现这样的结果~效率高点的方法,一次取出或者循环取出~
给个代码示例吧~

第1个回答  2013-07-10
正则可以提取所有URL的啊。
string web_code;
MatchCollection ms = new Regex("(?<=<a href=\"URL\"/>).*?(</a>)").Matches(web_code);
//个人喜欢用预搜索,你可以改的,用Matches获取所有的URL
然后:
ms[0].Value //第一个URL的值
ms[1].Value //第二个URL的值
按此类推...追问

好像写到c#里面执行不了
我现在想用在一个div标记内所有的URL是这样的格式
text
然后我写的是
Regex("(?)")
求指教~

追答

Regex("(?)")

追问

亲~还是不行昂~我试过了。取出来之后的ms的集合count为0
然后ms[0].value 就不对~异常 ~索引超出范围
因为0处没有数值~

追答

已测试:
Regex("(?)")

点(.)匹配任意字符,(.*?)就是多个任意字符,同样,( *?)就是匹配多个空格。

追问

试过了。。你的这个是可以的。我解决的时候写的是~.+?)\".+?>

本回答被提问者和网友采纳
第2个回答  2013-07-10
/// <summary>
/// 获取符合条件的第一笔数据
/// </summary>
/// <param name="strInfo">需要进行查找的字符串</param>
/// <param name="stMark">开始标识</param>
/// <param name="edMark">结束标识</param>
/// <returns>开始与结束标识之间的内容</returns>
private static string GetFirstString(string strInfo, string stMark, string edMark)
{
int idx = strInfo.IndexOf(stMark);
int stLen = stMark.Length;
int len = strInfo.Length;
if (idx > -1)
{
strInfo = strInfo.Substring(idx + stLen, len - idx - stLen);
int endIdx = strInfo.IndexOf(edMark);
strInfo = strInfo.Substring(0, endIdx);
return strInfo;
}
else
{
return "";
}
}

思路大概这样吧,具体的根据具体来改。。
第3个回答  2013-07-10
  Regex threg = new Regex(@"(?<=<a\s*href="")[^""]*(?="")");
            MatchCollection theMatches = threg.Matches("<a href="URL"/></a>");
            string result = "";
            foreach (Match thematch in theMatches)
            {
                if (thematch.Length!=0)
                {
                    result += thematch.Value.ToString();                    
                }

            }

第4个回答  2013-07-10
性能最高的,肯定是 IndexOf("<a "),然后得到位置后在这个位置之后检索 IndexOf("href=") 然后在用 SubString 取之后的引号内的内容。
第5个回答  2013-07-10
<a.+?href="(?<url>.+?)".+?></a>
提取分组 url追问

我明白 怎么用正则表达式来写~ 重要的是 怎么在c#代码中 取出所有 URL

追答

string pattern = ".+?)\".+?>";
Regex reg = new Regex(pattern);
MatchCollection matches = reg.Matches(网页源代码);
List list = new List();
foreach(Match mat in matches)
{
string result = mat.Group["url"].Value;
list.Add(result);
}

没有在vs里写,手写的,应该是这样的。list里就是全部的url。 知道分组(Group)这个概念就行了 。

追问

这样效率比较高么~?

C#正则表达式则如何验证url?
String regEx = "^(http|https|ftp)\\\\:\/\/([a-zA-Z0-9\\\\.\\\\-]+(\\\\:[a-zA-"+ "Z0-9\\\\.&%\\\\$\\\\-]+)*@)?((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{"+ "2}|[1-9]{1}[0-9]{1}|[1-9])\\\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}"+ "[0-9]{2...

问个C# 问题,请问怎么样实现提取某个网页中的所有的链接地址并且显示在...
1、请求网页,2、用正则表达式匹配标记(一般通过 href 来获取Url),3、将匹配的Url和当前的层级添加到Wait列表末尾 4、获取Wait列表的第一项,重复1~4。一般要定义一个深度,比如4,只出当请求网页的层级为5层时退出循环。以上只是理论。

C# 提取网页的超链接
使用正则表达式。把所有以<a开头以<\/ a>结束的全都提取出来。这样你可以得到一个集合。然后再使用字符串的相关操作把这个集合的每个条目里面的对应的有用的信息提取出来。遍历源文件:使用HttpWebRequest和HttpWebResponse类。这两个类可以帮你把某个URL标识的网页以流或者字符串的形式读到内存里面。也...

跪求:C#提取网页中详细地址
你只要知道盛放那篇文章的容器的id就行,比如你的提问标题“跪求:C#提取网页中详细地址”是放在一个id为question_title的Div里,只要找到这个Div就可以获得里面的内容,你可以用Webbrowser或者System.Net.WebClient,建议用前者简单些,给你举个例子 \/\/Webbrowser private void button1_Click(object sender...

C#中提取网页中的网址怎么提取?
使用httpwebrequest+httpwebresponse+正则 前2个类在System.Net命名空间中 例如:这个可以帮你读取到网页的源码 Uri uri = new Uri("http:\/\/www.baidu.com");try { HttpWebRequest req = WebRequest.Create(uri) as HttpWebRequest;HttpWebResponse res = req.GetResponse() as HttpWebResponse;S...

C#怎么用正则表达式提取链接和图片标签的属性
StringCollection resultList = new StringCollection();try { Regex regexObj = new Regex(@"\\s*?"); Match matchResult = regexObj.Match(subjectString); while (matchResult.Success) { resultList.Add(matchResult.Groups[1].Value); matchResult = matchResult.NextMatch(); }...

Asp.net中如何将显示出来的URL地址转换为超链接?(使用C#实现)
这个简单,用正则表达式就可以了引用命名空间:using System.Text.RegularExpressions;string strContent = “这是测试 http:\/\/www.test.com";\/\/超级链识别Regex urlregex = new Regex(@"( http:\\\/\\\/([\\w.]+\\\/?)\\S*)",RegexOptions.IgnoreCase| RegexOptions.Compiled);strContent = urlregex....

C#怎么取到这个网址
GetResponseStream();StreamReader readStream = new StreamReader(receiveStream, System.Text.Encoding.UTF8);string source = readStream.ReadToEnd();response.Close();readStream.Close();到了这里整个源代码已经保存在source(string变量)里面了。然后再用正则表达式将需要的子字符串提取出来即可。

关于C#正则表达式截取代码的问题,网页中有很多 xxxxxxxxx 2012-9-25...
为什么要用正则表达式呢?js不是简单的多嘛。.innerHTML这个属性便能得到一对标签中所有的内容。

我现在已经利用C#提取出了网页的源代码,请问如何利用C#提取出该网页中...
你查找一下c# 采集,简单来说就是利用C#本身的IndexOf或者Substring之类的函数,以及正则表达式之类的来分离数据。

相似回答