我正在尝试使用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循环中没有任何内容,导致错误。确认!我没得到什么?
答案 0 :(得分:2)
您可以使用类似的东西来访问各个节点:
$children = $newsBlurbNode->childNodes;
foreach ($children as $child) {
//do something with individual nodes
}
答案 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;