0

好的,所以我试图通过正则表达式从谷歌主页中提取所有链接。

但我面临一个莫名其妙的问题。当我将请求发送到谷歌主页并尝试从页面中提取所有链接时,我通常会得到一个结果,其余的都是垃圾。但是,当我手动查看页面的源代码并提取一些链接以针对它工作的模式进行测试时。

现在我不知道这里出了什么问题,我认为我的模式有缺陷,我正在努力让它正确,或者谷歌可能正在向我的代码和浏览器发送不同的响应。如果我能对这个问题有所了解,我真的很感激。

我的模式

string pattern = @"=("")?(https?:\/\/)?[\w.-]+\.[\w]*([/]?[\w]*)*("")?";

我的显示代码

Match match = Regex.Match(source, pattern);
        if (match.Success)
        {
            foreach (var res in match.Groups)
            {
                Console.WriteLine(res);
            }
            Console.ReadKey();
        }
4

3 回答 3

3

我认为问题在于您只能获得一场比赛。你需要调用Matches,或者运行一个循环:

Matches ms = Regex.Matches(source, pattern);
foreach (var m in ms)
{
    Console.WriteLine(m.Value);
}

或者 ...

Match m = Regex.Match(source, pattern);
while (m.Success)
{
    Console.WriteLine(m.Value);
    m = m.NextMatch();
}

请注意,您通常不应该尝试使用正则表达式解析 HTML。那里有疯狂。但是,如果您不关心您选择的某些“链接”不是真正的链接(即它们可能是文本而不是href),那么以这种方式使用正则表达式不是问题。

顺便说一句,有一篇 MSDN 文章Example: Scanning for HREFs,您可能会发现它很有用。

于 2013-08-06T21:59:28.780 回答
3

不要尝试使用 regex 解析 HTML。改用 HTML 解析器,例如Html Agility Packhref这会从给定的网页(从他们的示例页面)获取所有链接

HtmlWeb hw = new HtmlWeb();
HtmlDocument doc = hw.Load(myURL);
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href]"))
{
}
于 2013-08-06T21:58:01.767 回答
-1

好的,我想我找到了问题所在。Regex.Match只返回一个答案替换它Regex.Matches以返回一大堆链接

于 2013-08-06T22:00:38.157 回答