页面抓取和正则表达式应该没有结果

时间:2013-11-08 18:26:27

标签: php regex wordpress podscms

我有一个基于wp的小脚本,用于抓取网页并使用preg_match_all()计算4个关键字的出现次数。

这是我知道包含关键字的网址的代码:

<?php

$url ='http://www.leggioggi.it/2013/08/16/i-tre-amici-discutono-di-servizio-sanitario-casuale-e-differenze-nord-sud/';

$response = wp_remote_get($url);

    $the_body = wp_remote_retrieve_body($response);
    //echo htmlentities($the_body);

    $matches = array();

    $matches_count = preg_match_all("/gravidanz|preconcezional|prenatal|concepimento/i", $the_body, $matches);

var_dump ($matches_count);
var_dump ($matches);
?>

我有一些奇怪的问题。在某些页面上我得到零匹配,即使我知道这些页面包含关键字。我注意到,对于那些页面,取消注释行echo htmlentities($the_body);可以解决问题。如果我再次发表评论,那么奇怪就会回来。

我的猜测是涉及到一些缓存机制。

PS:代码不是写在模板文件上,而是写在pods框架页面中。

更新: 我在htmlentities线之后放了一个var_dump($the_body);。这种行为很有趣。如果echo htmlentities($the_body);被注释掉var_dump($ the_body);返回一个空字符串;如果同一行是活动的,var_dump($ the_body);返回整个页面的HTML。所以我真的不知道发生了什么!

解决: 我检查了$ response var(我的错误没想到)我发现当确实存在远程服务器错误时,wp_remote_get()返回的响应中报告了错误。 这就是我的回忆:

object(WP_Error)#30 (2) {
  ["errors"]=>
  array(1) {
    ["http_request_failed"]=>
    array(1) {
      [0]=>
      string(69) "Operation timed out after 5000 milliseconds with 25692 bytes received"
    }
  }
  ["error_data"]=>
  array(0) {
  }
}

1 个答案:

答案 0 :(得分:1)

我检查了$ response var(我的错误没想到)我发现确实存在远程服务器错误,错误是在wp_remote_get()返回的响应中报告的。 这就是我的回忆:

object(WP_Error)#30 (2) {
  ["errors"]=>
  array(1) {
    ["http_request_failed"]=>
    array(1) {
      [0]=>
      string(69) "Operation timed out after 5000 milliseconds with 25692 bytes received"
    }
  }
  ["error_data"]=>
  array(0) {
  }
}

所以它解决了。我只需要检查http错误并重复请求有限次数,如果没有给出正确的响应,则忽略该资源。