2017-06-06 67 views
0

我正在编写一个使用简单的HTML DOM解析器进行网页抓取的项目。我从我的数据库中抓取网页,提取内容并将其存储在数据库中。该代码与第一个URL一起工作正常,但在剩余的URL上它只是跳出循环。以下是我的代码。为什么我的代码跳出一个循环在php

include_once('Connections/elecom_connect.php'); 
include_once('dom/simple_html_dom.php'); 

mysqli_select_db($elecom_connect,$database_elecom_connect); 
$sql = "SELECT * FROM link_data"; 
$result_links = array(); 
$result_cates = ''; 
$result_subs = ''; 
$result_names = ''; 
$num = -1; 
$count = 0; 

$img = '.image-wrapper img'; 
$brand = 'h2.title span.brand'; 
$name = 'h2.title span.name'; 
$price = 'span.price-box'; 
$link = 'section.products a.link'; 

$site = new simple_html_dom(); 

$query = mysqli_query($elecom_connect,$sql); 

if (!$query){ 
    echo 'Database error: ' . mysqli_error($elecom_connect); 
} 

while ($row = mysqli_fetch_array($query)) { 
    $result_links[] = $row; 
} 

foreach($result_links as $link){ 
    $var = $link['link']; 
    if (!empty($var)) { 
     var_dump($var); 

     $site->load_file($var); 
     if (!empty($site)) { 
      $currentImg = $site->find($img); 
      $currentBrand = $site->find($brand); 
      $currentName = $site->find($name); 
      $currentPrice = $site->find($price); 
      $currentLink = $site->find($link); 

      $rid = $link['id']; 
      $rcates = $link['link_category']; 
      $rsubs = $link['link_subcategory']; 
      $rnames = $link['link_name']; 
      if (!empty($currentImg)) { 
       foreach($currentImg as $im){ 
        $count++; 

        if($count % 2 == 0 && $count < 40){ 
         $num++; 

         $cImg = $im->src; 
         $cBrand = "<p>".$currentBrand[$num]->plaintext."</p>"; 
         $cName = "<p>".$currentName[$num]->plaintext."</p>"; 
         $cPrice = "<p>".$currentPrice[$num]->plaintext."</p>"; 
         //$cLink = $currentLink[$num]->href; 

         $content = file_get_contents($cImg); 
         //Store in the filesystem. 
         $save_path = "cachedPages/$rid.$num.jpg"; 
         file_put_contents($save_path,$content); 

         $insertSQL = "INSERT INTO item_detail (item_name, item_brand, item_price, item_img, item_cate, item_sub_cate,filter_by) VALUES ('$cName', '$cBrand', '$cPrice','$save_path','$rcates','$rsubs','$rnames')"; 

         mysqli_select_db($elecom_connect,$database_elecom_connect); 
         $Result1 = mysqli_query($elecom_connect,$insertSQL) or die(mysqli_error(   $elecom_connect)); 

         echo 'Success'; 


        } 
       } 
      } 

     } 
    } 
    $site->clear(); 
} 

这是我得到的错误代码。

Fatal error: Uncaught Error: Call to a member function find() on null in dom/simple_html_dom.php:1113 Stack trace: #0

我该怎么办?

+1

确保您的$ image $ brand $ price $ link和$ name在dom/simple_html_dom.php文件中未设置为空 – AMH

+0

它们未设置为null。它第一次运行第一个URL,但不能再运行第二个URL –

+0

我不能用空检查重现它,但该错误是说'$ site'是'null'和'null'没有一个'find()'方法。它是如何越过空的IDK。这是'simple_html_dom'文件吗? – nerdlyist

回答

0

这行代码是不正确的:

$site = new simple_html_dom(); 

你显然并不需要基于在GitHub上的例子目录要做到这一点https://github.com/samacs/simple_html_dom/tree/master/example

你想要做的是使用一个两种方法

file_get_htmlstr_get_html当您包含include_once('dom/simple_html_dom.php');时会加载它们。

所以你真的想看到

$site = file_get_html($url); //URL to a site you are parsing ie 'http://www.google.com/' 
//OR 
$site = str_get_html($str); // String file to some html file 

这在您阅读的代码实际上创建了一个$dom_node上它具有的find方法。

你有什么奇怪的原因是因为你正在创建和对象,当你检查if(!empty($site))它返回true,因为有一个对象。但是,内部dom_node设置不正确。

当你进入这个行林达1113文件不是你的你有一个空dom_nodenull->find()将抛出你所得到的错误。

+0

嗯,我会试试....感谢您的回答 –

+0

请一旦我拿到我的笔记本电脑并尝试给出的答案,我就会upvote。 –

+0

这是我使用ur建议后的新错误信息 警告:file_get_contents():stream不支持在第75行的dom/simple_html_dom.php中寻找012, 警告:file_get_contents():无法寻求位置-1在第75行dom/simple_html_dom.php中的流# –

-2

您将每个行都替换为整个数组,以便只删除最后一个网址。

$result_links = array(); 
while ($row = mysqli_fetch_array($query)) 
{ 
    array_push($result_links, $row); 
} 
+1

'[]'表明它是一个数组,所以你说的是不正确的。 – RST

+0

@RST我知道它是一个数组,但代码不会追加到数组,它会替换数组。 –

+0

问题是执行了第一个URL,但其余的都没有... –

相关问题