使用PHP Simple HTML DOM Parser处理html时不时出现致命错误

时间:2016-07-22 18:01:09

标签: php html dom

我使用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)); 
?>

1 个答案:

答案 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)); 
            }
        }