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循环中没有任何内容.确认!我得不到什么?
您可以使用类似的方法来访问各个节点:
$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