我正在为学校开发一个PHP项目。任务是建立一个网站来抓取和分析来自其他网站的数据。我已经设置了框架,并且我能够从所需的站点获取某些数据,但我似乎无法获得我需要获取的其他数据的语法。
例如,我目前正在分析的网站是从Amazon.com搜索返回的特定项目的页面(例如,搜索amazon.com的“iPad”并选择第一个结果)。我能够获取产品页面的标题,但我需要抓住审核次数和价格,这就是问题所在。我正在使用preg_match
来获得标题(工作正常),但我无法获得评论或价格。我继续得到Undefined Offset错误,我发现这意味着没有返回任何符合给定条件的错误。只是检查是否有东西被退回对我没有帮助,因为我需要获取这些数据以供我分析。我试图挖掘的是在页面上唯一的,因此每个只有一个实例。
我的产品页面的页面源包含我需要抓取的以下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是一个空数组,我想在其中存储结果(注意:'&lt;'in“&lt之后没有空格; span ...“当我输入”&lt; span ...“而没有空格时,它只删除了所有内容到”...(。*)...“:
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
和数据挖掘。非常感谢您的时间和帮助。
答案 0 :(得分:0)
正如@ cabellicar123所说,you shouldn't use regex with 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是搜索的字符串(在本例中是一个亚马逊页面),$ 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之后将$ leftover设置为$ string的一部分来缩小$ string。
$contents = substr($leftover, 0, strpos($leftover, $endtag));
这将获得$ endtag在$ leftover中的位置,并将$ endtag之前的所有内容存储在$ contents中。
至于最后几行代码,它们是特定于此示例的,只需要根据具体情况进行更改。