【问题标题】:REGEX : get webpage links正则表达式:获取网页链接
【发布时间】:2012-02-14 21:19:44
【问题描述】:

我两天前开始学习正则表达式,现在我想制作一个小应用程序,它可以读取网页的源代码并获取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

它只是获取 // 之后的第一个字符 当我查看我的模式时,我说大声笑是的,我的模式是 http://\w,所以它会得到第一个字符,但我想知道我应该在我的模式中添加什么才能获得其余的链接? ???

【问题讨论】:

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


【解决方案1】:

如果您只需要匹配 <a> 元素中的超链接,那么您可以利用括起来的引号或双引号来分隔您的 URL。

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

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

【讨论】:

    【解决方案2】:

    这个正则表达式应该做你想做的事。请注意,此正则表达式将支持除 HTTP 之外的 HTTPS

    https?://\\w*
    

    【讨论】:

    • 这与整个链接不匹配
    • 是的,我刚试过,情况有所好转,但仍然不匹配整个链接
    • https?://[^\\s]*(除空格之外的任何内容)
    【解决方案3】:

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

    这应该可行,因为链接通常用引号引起来

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

    【讨论】:

    • 哦,那好多了,但我不明白那种模式,你能不能给我解释一下。
    • [^abc] 表示匹配除字母 a、b 或 c 之外的任何内容。 ^ 表示不,没有它,你只匹配括号内的字符。我使用了引号,因为在 HTML 中,链接通常包含在引号内,因此该模式将从 http 匹配到只要找到引号
    【解决方案4】:

    您希望达到多准确/稳健的程度?迄今为止我发现的最好的正则表达式之一几乎可以匹配所有可能抛出的 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 放入锚标记中,例如:&lt;a href="http://junk,.sdf8(_.jf/.klkjl"&gt;Junk Link&lt;/a&gt;,因此您仍然需要验证 URL 是否具有正确的架构。

    【讨论】:

      猜你喜欢
      • 2012-05-28
      • 2018-08-02
      • 1970-01-01
      • 2011-11-06
      • 2013-08-28
      • 1970-01-01
      • 2010-09-05
      • 2011-05-31
      • 1970-01-01
      相关资源
      最近更新 更多