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

Lot*_*har 5 php dom screen-scraping zend-framework

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

在Zend_Dom的手册中,代码说:

foreach ($results as $result) {
    // $result is a DOMElement
}
Run Code Online (Sandbox Code Playgroud)

我如何使用这个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);
}
Run Code Online (Sandbox Code Playgroud)

这给了我:

object(DOMElement)#81 (0) {
}
object(DOMElement)#82 (0) {
}
object(DOMElement)#83 (0) {
}
... etc, etc...
Run Code Online (Sandbox Code Playgroud)

我觉得令人困惑的是,这看起来每个元素都不包含任何东西(0)!事实并非如此,但这是我的第一印象.所以我在网上找到了,发现我可以添加nodeValue以获得一些东西:

Zend_Debug::dump($r->nodeValue);
Run Code Online (Sandbox Code Playgroud)

这给了我:

string(6) "Images"
string(6) "Videos"
string(4) "Maps"
...etc, etc...
Run Code Online (Sandbox Code Playgroud)

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

比如给出这个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> 
Run Code Online (Sandbox Code Playgroud)

我可以使用我在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);
Run Code Online (Sandbox Code Playgroud)

这给了我:

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 ')]"
}
Run Code Online (Sandbox Code Playgroud)

我试图从中得到任何东西:

$children = $newsBlurbNode->childNodes;
     foreach ($children as $child) {
       }
Run Code Online (Sandbox Code Playgroud)

这导致错误,因为foreach循环中没有任何内容.确认!我得不到什么?

waj*_*jiw 2

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

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

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