使用PHP简单html DOM解析器处理html时,有时会出现致命错误

使用PHP简单html DOM解析器处理html时,有时会出现致命错误,php,html,dom,Php,Html,Dom,我正在使用PHP简单HTML DOM解析器根据目录号从宜家网站提取一些元数据 我测试的30275861号和其他几十个都工作正常,因此给出了该链接($produkt变量)和一些数据(如果链接粘贴到浏览器,则会给出带有kallax系统设备的页面) 给出数字69136138-链接结果($produkt变量),如果粘贴到浏览器(besta tv furniture),则会出现错误: 致命错误:调用布尔值上的成员函数find() 在大多数情况下有效的代码如下所示: <?php include('s

我正在使用PHP简单HTML DOM解析器根据目录号从宜家网站提取一些元数据

我测试的30275861号和其他几十个都工作正常,因此给出了该链接($produkt变量)和一些数据(如果链接粘贴到浏览器,则会给出带有kallax系统设备的页面)

给出数字69136138-链接结果($produkt变量),如果粘贴到浏览器(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)); 
?>

为什么不尝试在条件语句中包装您的
foreach
循环,以便只有当
$html
既不为null也不为空时,循环才会运行

    <?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)); 
            }
        }

为什么不尝试在条件语句中包装您的
foreach
循环,以便只有当
$html
既不为null也不为空时,循环才会运行

    <?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)); 
            }
        }

什么是
file\u get\u html
?@Dekel
file\u get\u html
simple\u html\u dom
类的一种方法…;-)因为它不是标准的PHP类/方法,所以应该在文章中提到它(应该提供lib的链接)。[…]使用PHP简单HTML DOM解析器。代码中包括('simple_html_dom.php');但是你在这里是链接什么是
file\u get\u html
?@Dekel
file\u get\u html
simple\u html\u dom
类的一种方法…;-)因为它不是标准的PHP类/方法,所以应该在文章中提到它(应该提供lib的链接)。[…]使用PHP简单HTML DOM解析器。代码中包括('simple_html_dom.php');但你就在这里,这是链接,谢谢波依兹。事实上,代码是肮脏的,不是最优的,但这不是重点-有没有人能告诉我为什么两个链接都指向同一个页面,但一个作为数据源,另一个不是-这是这里的问题。谢谢波伊兹。事实上,代码是肮脏的,不是最优的,但这不是重点——有没有人能告诉我为什么两个链接都指向同一个页面,但一个作为数据源,另一个不是——这就是这里的问题。