【问题标题】:Why does this regex not match the URLs in this Google results page?为什么此正则表达式与此 Google 结果页面中的 URL 不匹配?
【发布时间】:2012-11-25 21:32:25
【问题描述】:

我无法从 Google 结果中抓取网址。这段代码为我工作了很长时间,但似乎谷歌本周改变了一些东西,现在我得到了大量的额外字符,被我想要的实际 URL 包围。

preg_match_all('@<h3\s*class="r">\s*<a[^<>]*href="([^<>]*)"[^<>]*>(.*)</a>\s*</h3>@siU',     $results, $matches[$key]);

编辑

用上面的代码抓取所有的链接都是这样的

/url?url=http://cooksandtravelbooks.com/write-for-us/&rct=j&sa=U&ei=XdayUNnHBIqDiwKZuYEY&ved=0CBQQFjAA&q=cooking+%5C%22Write+for+Us%5C%22&usg=AFQjCNGMiCiWYY_8JDAhqJggVDW2qHRMfw

【问题讨论】:

  • 我建议不要使用正则表达式来解析 html...stackoverflow.com/questions/1732348/…。您最好使用 phpquery 或任何其他 DOM 解析器,而不是正则表达式。
  • 它对我有用。你能给我们展示一两个错误结果的例子,以及你用来检索它们的代码吗? (请不要发表评论。编辑​​问题并将此信息添加到其中。)
  • 您没有获得“实际网址”,因为当您点击 Google 链接时,您实际上是返回 Google,然后他们将您重定向到真实网址。

标签: php regex html-parsing


【解决方案1】:
<?php
$url = "http://www.google.com";
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$data = curl_exec($ch);
curl_close($ch);

$dom = new DOMDocument();
@$dom->loadHTML($data);

foreach($dom->getElementsByTagName('a') as $link) {
    echo $link->getAttribute('href');
    echo "<br />";
}
?>

【讨论】:

  • 感谢发布。我已将其添加到 htmlparsing.com/php.html,我发布它是为了回答大多数这些 PHP HTML 解析问题。
  • 可能还需要注意 @suppress 字符对于隐藏由于无效 html 标记引起的任何错误是必要的。
  • 添加注释。谢谢。如果有人想贡献,该站点的源代码在 GitHub 上:github.com/petdance/htmlparsing
  • 不幸的是,到目前为止,我仍然没有更好的运气使用这种方法获取实际 URL。
猜你喜欢
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多