我使用PHP Simple HTML DOM Parser从Ikea网站提取一些基于目录号的元数据。
编号30275861以及我测试的其他数十个正常工作,结果给出了该链接($ produkt变量)和一些数据http://www.ikea.com/pl/pl/catalog/products/30275861/?query=30275861(如果链接粘贴到浏览器,它给出了带有kallax系统家具的页面)
给出编号69136138 - 链接结果($ produkt变量)http://www.ikea.com/pl/pl/catalog/products/S69136138/?query=69136138如果粘贴到浏览器(besta tv furniture)有效则会出错:
致命错误:在布尔值
上调用成员函数find()在大多数情况下有效的代码如下所示:
<?php
include('simple_html_dom.php');
function clean($string) {
$string = str_replace(',', '.', $string);
return preg_replace('/[^A-Za-z0-9\-.]/', '', $string);
}
if(isset($_POST['produkt_id'])){
$produkt_id=str_replace('.', '', $_POST['produkt_id']);
$url="http://www.ikea.com/pl/pl/search/?query=".$produkt_id;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // Must be set to true so that PHP follows any "Location:" header
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$a = curl_exec($ch); // $a will contain all headers
$url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); // Return the last effective URL
$produkt=(string)$url;
$html = file_get_html($produkt);
echo $produkt_id;
echo "<br>";
echo $produkt;
foreach($html->find('meta[name=partnumber]') as $e) echo $kod=$e->content;
foreach($html->find('link[rel=image_src"]') as $e) echo $obrazek=$e->href;
foreach($html->find('meta[name=title]') as $e) echo $nazwa=$e->content;
foreach($html->find('meta[name=price]') as $e) echo $cena=floatval(clean($e->content));
?>
答案 0 :(得分:0)
为什么不尝试在条件语句中包装foreach
循环,这样只有当$html
既不为空也不为空时,循环才会运行?
<?php
// ... SOME CODE ABOVE
$html = file_get_html($produkt);
/* WHY NOT (AT THIS POINT) TRY TO INSPECT THE CONTENT OF $html? WITH VAR_DUMP?*/
var_dump($html); //<== JUST TO SEE THE DATA CONTENT...
// ONLY RUN FOR LOOPS (ECHOING OUT SOME DATA)
// IF AND ONLY IF $html HAS SOME CONTENT
if($html && !empty($html)){
echo $produkt_id; //<== MAKES SENSE TO ECHO THIS ONLY IF $html HAS DATA
echo "<br>"; //<== MAKES SENSE TO ECHO THIS ONLY IF $html HAS DATA
echo $produkt; //<== MAKES SENSE TO ECHO THIS ONLY IF $html HAS DATA
foreach($html->find('meta[name=partnumber]') as $e){
echo $kod=$e->content;
}
foreach($html->find('link[rel=image_src"]') as $e){
echo $obrazek=$e->href;
}
foreach($html->find('meta[name=title]') as $e){
echo $nazwa=$e->content;
}
foreach($html->find('meta[name= price]') as $e){
echo $cena=floatval(clean($e->content));
}
}