使用Zend_Dom作为屏幕抓取工具

时间:2010-12-01 02:46:43

标签: php zend-framework screen-scraping

如何?

更重要的是......

这样:

$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);
$result = $dom->query('div.note');
Zend_Debug::dump($result);

给了我这个:

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 ')]"
}

我不能为我的生活找出如何做到这一点。

我想提取检索到的数据的各个部分(即带有“note”类的div和它内部的任何元素......就像文本和URL一样)但是无法获得任何工作。

有人在php.net上指出了DOMElement类,但是当我尝试使用上面提到的一些方法时,我无法使用它。我如何从页面中抓取一大块html并通过它抓取各个部分?我如何检查这个对象我回来了所以我至少可以弄清楚它里面有什么?

Hjälp?

1 个答案:

答案 0 :(得分:4)

Iterator Zend_Dom_Query_Result实现为每次迭代返回一个DOMElement对象:

foreach ($result as $element) {
    var_dump($element instanceof DOMElement); // always true
}

$ element 变量中,您可以使用任何DOMElement方法:

foreach ($result as $element) {
    echo 'Element Id: '.$element->getAttribute('id').PHP_EOL;
    if ($element->hasChildNodes()) {
        echo 'Element has child nodes'.PHP_EOL;
    }
    $aNodes = $element->getElementsByTagName('a');
    // etc
}

您也可以访问document element,或者使用Zend_Dom_Query_Result执行此操作:

$document1 = $element->ownerDocument;
$document2 = $result->getDocument();
var_dump($document1 === $document2); // true
echo $document1->saveHTML();