好的,我试图通过正则表达式从谷歌主页中提取所有链接。
但我面临一个令人困惑的问题。当我将请求发送到谷歌主页并尝试从页面中提取所有链接时,我通常得到一个结果,休息是垃圾。但是,当我手动查看页面的来源并提取一些链接以测试其运行的模式时。
现在我不知道这里有什么问题我认为我的模式存在缺陷,我正在努力做到正确或者谷歌正在向我的代码和浏览器发送不同的回复。如果我能对这个问题有所了解,我真的很感激。
我的模式
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();
}
答案 0 :(得分:3)
Don't try and parse HTML with regex。使用HTML解析器,例如Html Agility Pack。这会从给定的网页(来自他们的example page)
获取所有href
个链接
HtmlWeb hw = new HtmlWeb();
HtmlDocument doc = hw.Load(myURL);
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href]"))
{
}
答案 1 :(得分: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,您可能觉得它很有用。
答案 2 :(得分:-1)
好的,我想我发现了问题。Regex.Match
只返回一个答案,用Regex.Matches
替换它以返回一大堆链接