Zend_Dom给你一个DOMElement ...我该如何使用它?

时间:2010-11-30 17:42:49

标签: php zend-framework dom screen-scraping

我正在尝试使用Zend_Dom进行一些非常轻的屏幕抓取(我想抓住标题,一些正文以及我网站上一小块新闻项目的链接)我不知道如何处理它给我的DOMElement。

在Zend_Dom的手册中,代码说:

foreach ($results as $result) {
    // $result is a DOMElement
}

如何使用此DOMElement?

详细示例(在Google上查找主要元素):

$url='http://google.com/';
$client = new Zend_Http_Client($url);
$response = $client->request();
$html = $response->getBody();
$dom = new Zend_Dom_Query($html);
$results = $dom->query('a');
foreach($results as $r){
     Zend_Debug::dump($r);
}

这给了我:

object(DOMElement)#81 (0) {
}
object(DOMElement)#82 (0) {
}
object(DOMElement)#83 (0) {
}
... etc, etc...

我觉得令人困惑的是,这看起来每个元素都不包含任何内容(0)!事实并非如此,但这是我的第一印象。所以我在网上逛了一圈,发现我可以添加nodeValue来解决这个问题:

Zend_Debug::dump($r->nodeValue);

给了我:

string(6) "Images"
string(6) "Videos"
string(4) "Maps"
...etc, etc...

但是遇到麻烦的地方是获取特定元素及其内容。

例如给出这个html:

  <div class="newsBlurb">
   <span class="newsDate">Mon, 11 October 2010</span>
   <h3 class="newsHeadline"><a href="http://foo.com/1/2/">Some text</a></h3>
   <a class="newsMore" href="http://foo.com/1/2/">More</a>
  </div> 
  <div class="hr"></div>
  <div class="newsBlurb">
   <span class="newsDate">Mon, 16 August 2010</span>
   <h3 class="newsHeadline"><a href="http://bar.com/pants.html">Stuff is here</a></h3>
   <a class="newsMore" href="http://bar.com/pants.html">More</a>
  </div> 

我可以使用我在Google示例中使用的技术从每个newsBlurb中获取文本,但无法自行获取每个元素。我想获取日期并将其粘贴到某处,获取标题文本并将其粘贴到某处并获取要使用的链接。但我得到的只是div中的实际文本。

如何从中得到我想要的东西?


修改 这是另一个不能按我的预期工作的例子。有什么想法吗?

$url = 'http://php.net/manual/en/class.domelement.php';
$client = new Zend_Http_Client($url);
$response = $client->request();
$html = $response->getBody();
$dom = new Zend_Dom_Query($html);
$newsBlurbNode = $dom->query('div.note');
Zend_Debug::dump($newsBlurbNode);

这给了我:

object(Zend_Dom_Query_Result)#867 (7) {
  ["_count":protected] => NULL
  ["_cssQuery":protected] => string(8) "div.note"
  ["_document":protected] => object(DOMDocument)#79 (0) {
  }
  ["_nodeList":protected] => object(DOMNodeList)#864 (0) {
  }
  ["_position":protected] => int(0)
  ["_xpath":protected] => NULL
  ["_xpathQuery":protected] => string(33) "//div[contains(@class, ' note ')]"
}

试图从我使用的东西中获取任何东西:

$children = $newsBlurbNode->childNodes;
     foreach ($children as $child) {
       }

由于foreach循环中没有任何内容,导致错误。确认!我没得到什么?

2 个答案:

答案 0 :(得分:2)

您可以使用类似的东西来访问各个节点:

$children = $newsBlurbNode->childNodes;
foreach ($children as $child) {   
    //do something with individual nodes
} 

否则我会通过:http://php.net/manual/en/class.domelement.php

答案 1 :(得分:2)

嘿,我一直在搞类似的东西 - 让我知道这是否足以帮助你 - 如果不是我可以解释一下。

$data = "<p id='p_1'><a href='testing1.html'><span>testing in a span 1</span></a></p>
         <p id='p_2'><a href='testing2.html'></a></p>
         <p id='p_3'><a href='testing3.html'><span>testing in a span 3</span></a></p>
         <p id='p_4'><a href='testing4.html'><span>testing in a span 4</span></a></p>
         <p id='p_5'><a href='testing5.html'><span>testing in a span 5</span></a></p>";

$dom = new Zend_Dom_Query();
$dom->setDocumentHtml($data);

//Look for any links inside of paragraph tags
$results = $dom->query('p a');

foreach($results as $r){

   echo "Parent Tag: ".$r->nodeName."<br />";
   echo $r->nodeValue."<br />";
   $children = $r->childNodes;

   if($children->length > 0){

       $children = $r->childNodes;

       foreach($children as $c){
           echo "Child Tag: <br />";
           echo $c->nodeName."<br />";
           echo $c->nodeValue."<br />";
       }

  }

   echo $r->getAttribute('href')."<br /><br />";

}

echo $data;