2012-01-15 82 views
0

我使用下面的代码解析DOM文档,但最后我得到的错误 “google.ac”为空或不是对象 线402 焦炭1PHP PRODOM解析错误

我想什么,第402行包含标签和很多“;”, 我该如何解决这个问题?

<?php 

//$ch = curl_init("http://images.google.com/images?q=books&tbm=isch/"); 


// create a new cURL resource 
$ch = curl_init(); 

// set URL and other appropriate options 
curl_setopt($ch, CURLOPT_URL, "http://images.google.com/images?q=books&tbm=isch/"); 
curl_setopt($ch, CURLOPT_HEADER, 0); 

// grab URL and pass it to the browser 
$data = curl_exec($ch); 

curl_close($ch); 

$dom = new DOMDocument(); 
     $dom->loadHTML($data); 
    //@$dom->saveHTMLFile('newfolder/abc.html') 

    $dom->loadHTML('$data'); 

    // find all ul 

    $list = $dom->getElementsByTagName('ul'); 
    // get few list items 

    $rows = $list->item(30)->getElementsByTagName('li'); 
    // get anchors from the table 

    $links = $list->item(30)->getElementsByTagName('a'); 

    foreach ($links as $link) { 
     echo "<fieldset>"; 
     $links = $link->getElementsByAttribute('imgurl'); 

    $dom->saveXML($links); 
       } 
?> 
+0

'$ dom-> loadHTML('$ data1');'肯定是错误的。 – chx 2012-01-15 14:45:27

+0

那我该怎么办呢?我该怎么办?我的基本目标是从代码中获取内容,并可能保存它。 – 2012-01-15 14:51:46

+0

对不起,我已经得到了您的要点chx,它的$数据。当我尝试这个时,我试图使用get_matche()来提取只需要的标签,但是当粘贴代码在这里时,我忘了更改变量..现在更新,谢谢亲爱的 – 2012-01-15 17:55:29

回答

1

没有与代码的几个问题:

  1. 您应该添加卷曲选项 - CURLOPT_RETURNTRANSFER - 为了捕获输出。默认情况下,输出显示在浏览器上。像这样:curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);。在上面的代码,$data永远是TRUE或FALSE(http://www.php.net/manual/en/function.curl-exec.php

  2. $dom->loadHTML('$data');是不正确的,不需要

  3. “A”的标签可能是不正确的阅读“礼”的方法,并且因为$ list-> item(30)将始终指向第30个元素

总之,即将到来的修复。我不确定你是否检查了CURL请求返回的HTML,但它看起来与我们在original post中讨论的不同。换句话说,CURL返回的HTML不包含所需的<ul><li>元素。它代之以包含<td><a>元素。

附加组件我不是很确定为什么当浏览器和从PHP读取时,为同一页的HTML不同。但这是我认为可能适合的理由。该页面使用JavaScript代码在页面加载时动态呈现一些HTML代码。从浏览器查看时,可以看到这种动态HTML,但不能从PHP查看。因此,我假设<ul><li>标签是动态生成的。无论如何,这不是我们现在关注的问题。

因此,你应该修改你的代码来解析<a>元素,然后读取图像的URL。此代码片段可能有所帮助:

<?php 
$ch = curl_init(); // create a new cURL resource 

// set URL and other appropriate options 
curl_setopt($ch, CURLOPT_URL, "http://images.google.com/images?q=books&tbm=isch/"); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 

$data = curl_exec($ch); // grab URL and pass it to the browser 
curl_close($ch); 

$dom = new DOMDocument(); 
@$dom->loadHTML($data); // avoid warnings 

$listA = $dom->getElementsByTagName('a'); // read all <a> elements 
foreach ($listA as $itemA) { // loop through each <a> element 
    if ($itemA->hasAttribute('href')) { // check if it has an 'href' attribute 
     $href = $itemA->getAttribute('href'); // read the value of 'href' 
     if (preg_match('/^\/imgres\?/', $href)) { // check that 'href' should begin with "/imgres?" 
      $qryString = substr($href, strpos($href, '?') + 1); 
      parse_str($qryString, $arrHref); // read the query parameters from 'href' URI 
      echo '<br>' . $arrHref['imgurl'] . '<br>'; 
     } 
    } 
} 

我希望以上是有道理的。但请注意,如果Google修改其HTML,则上述解析可能会失败。

+0

再次感谢abhay帮助我......你看起来是一个帮助别人的好人,上帝保佑你......我试着你的代码,并会确认你的结果。再次感谢兄弟.. – 2012-01-16 14:13:18

+0

中提琴...它的作品...感谢你的朋友...感谢您的帮助,如果我可以投你,我会做很多解决方案,帮助和指导,再次感谢 – 2012-01-16 14:17:47

+0

很棒@NewBee,很高兴知道它对你有用。并感谢您的反馈:-) – Abhay 2012-01-16 15:23:23