REGEX:获取网页链接

时间:2012-02-14 21:19:44

标签: c# regex web-crawler web-scraping

我2天前开始学习REGEX,现在我想创建一个小应用程序来读取网页的源代码并获取http://page.comhttp://www.page.com/sub/sub/sub?=value等网页.....这样的东西,无论如何我输入的代码:

Regex r = new Regex("http://\\w");

        HttpWebRequest httpwebrequest = (HttpWebRequest)WebRequest.Create("http://maktoob.yahoo.com/?p=us");
        HttpWebResponse response = (HttpWebResponse)httpwebrequest.GetResponse();

        StreamReader sr = new StreamReader(response.GetResponseStream());

        string line;

        while ((line = sr.ReadLine()) != null)
        {
            Match m = r.Match(line);
            if (m.Success)
            {
                Console.WriteLine("Match: " +m.Value);
            }
        }
        sr.Close();
        response.Close();

但结果是:

匹配:http://l 匹配:http://w 匹配:http://x 匹配:http://l 匹配:http://q

它只是获得//之后的第一个字符 当我看着我的模式时,我说lol是的,我的模式是http:// \ w,所以它将获得第一个角色,但我想知道我应该添加到我的模式中,以获得其余的链接? ???

4 个答案:

答案 0 :(得分:1)

如果您只需匹配<a>个元素中的超链接,那么您可以利用封闭引号或双引号来界定您的网址。

Regex regex = new Regex(@"(?<=href=('|""))https?://.*?(?=\1)");

这将匹配以href='…'href="…"开头的http://https://属性中的任何文字。

答案 1 :(得分:0)

这个正则表达式应该做你想要的。请注意,除了HTTP

之外,此正则表达式还支持HTTPS
https?://\\w*

答案 2 :(得分:0)

尝试https?://[^'\"]+

这应该有效,因为链接通常用引号括起来

[edit]甚至更好,只匹配有效字符。 [abc]+将匹配括号中的每个字符中的一个或多个。查看this答案以获取有效字符列表

答案 3 :(得分:0)

您希望获得多么准确/健壮?到目前为止,我发现的最好的正则表达式之一几乎与所有可能引用它的URL相匹配:

_^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[a-z\x{00a1}-\x{ffff}]{2,})))(?::\d{2,5})?(?:/[^\s]*)?$_iuS

您可以在此处查看网址验证正则表达式的完整比较表:http://mathiasbynens.be/demo/url-regex

更新

正如道格拉斯所提到的,如果你想匹配链接,而不是任何作为URL模式传递的文本,那么你可以查看锚标签。但是,人们可以将ANYTHING放在锚标记中,例如:<a href="http://junk,.sdf8(_.jf/.klkjl">Junk Link</a>,因此您仍需要验证URL是否具有正确的架构。