PHP网站数据挖掘Preg_Match未定义偏移


PHP website data mining Preg_Match Undefined Offset

我正在为学校做一个PHP项目。任务是建立一个网站,从另一个网站抓取和分析数据。我已经设置了框架,我能够从所需的网站抓取某些数据,但我似乎无法获得我需要获得的其他数据的语法正确。

例如,我目前正在分析的站点是一个从Amazon.com搜索返回的特定项目的页面(例如,在Amazon.com搜索"iPad"并选择第一个结果)。我能够获取产品页面的标题,但我需要获取评论数和价格,这就是问题所在。我正在使用preg_match获取标题(运行良好),但我无法获得评论和价格。我继续得到未定义偏移错误,我发现这意味着没有返回与给定条件匹配的任何内容。简单的查看是否有东西被退回是没有帮助的,因为我需要获得这些数据来进行分析。我试图挖掘的's在页面上是唯一的,所以每个只有一个实例。

我的产品页面的Page Source包含以下我需要抓取的HTML片段。(这个网站可以,也需要能够处理任何东西,但对于这个例子,我搜索了"iPad")。

<span id="priceblock_ourprice" class="a-size-medium a-color-price">$397.74</span>

我需要397.74

<span id="acrCustomerReviewText" class="a-size-base">1,752 customer reviews</span>

我需要1,752

我已经尝试了转义字符,通配符等的所有组合,但我似乎无法超越未定义偏移错误。我的代码的一个示例如下,其中$link是URL, $f是一个空数组,我想在其中存储结果(注意:在"<"中的"<"之后没有空格)。跨度……"当我输入"<"时,它只是删除了直到"…(.*)…"

preg_match("#'< span id'='"priceblock'_ourprice'" class'='"a'-size'-medium a'-color'-price'"'>(.*)'<'/span'>#", file_get_contents($link), $f);
$price=$f[1]; //Offset error occurs on this line
echo $price;

请帮助。这两天我一直在想这件事。我希望我只是在做蠢事。这是我第一次使用preg_match和数据挖掘。

代码

正如@cabellicar123所述,你不应该在html中使用正则表达式。我相信你正在寻找的是strpos()和substr()。它应该看起来像这样:

function get_content($string, $begintag, $endtag) {
  if (strpos($string, $begintag) !== False) {
    $location = strpos($string, $begintag) + strlen($begintag);
    $leftover = substr($string, $location);
    $contents = substr($leftover, 0, strpos($leftover, $endtag));
    return $contents;
  }
}
// Usage (Change the variables):
$str = file_get_contents('http://www.amazon.com/OLB3-Official-League-Recreational-Ball/dp/B004KOBRMC/');
$beg = '<b class="priceLarge">$';
$end = '</b>';
get_content($str, $beg, $end);

我已经提供了一个工作示例,它将返回页面上对象的价格,在本例中是rawlings棒球的价格。

我将逐行浏览代码,并解释每一部分。

function get_content($string, $begintag, $endtag)

$string是正在搜索的字符串(在本例中是amazon页面),$begintag是正在搜索的元素的开始标记,$closetag是该元素的结束标记。注意:这将只使用开始标签的第一个实例,超过该实例将被忽略。

if (strpos($string, $begintag) !== False)

检查开始标签是否确实存在。注意!== False;这是因为strpos可以返回0,其结果为False。

$location = strpos($string, $begintag) + strlen($begintag);

strpos()将返回$string中$begintag的第一个实例,因此必须将$begintag的长度添加到strpos()中以获得$begintag结束的位置。

$leftover = substr($string, $location);

现在我们有了开始标签的$location,我们需要通过将$ remaining设置为$location之后的$字符串部分来缩小$字符串。

$contents = substr($leftover, 0, strpos($leftover, $endtag));

获取$endtag在$ remaining中的位置,并将$endtag之前的所有内容存储在$contents中。

至于最后几行代码,它们是特定于这个例子的,只需要修改以适应环境。