J'essaie d'utiliser Zend_Dom pour un scrappage d'écran très léger (je veux saisir un titre, un texte de corps et un lien d'un petit bloc de nouvelles sur mon site Web) et je ne sais pas comment gérer le DOMElement que cela me donne.Zend_Dom vous donne un DOMElement ... comment l'utiliser?
Dans le manuel pour Zend_Dom le code dit:
foreach ($results as $result) {
// $result is a DOMElement
}
Comment puis-je faire usage de cette DOMElement?
Un exemple détaillé (recherche des éléments d'ancrage sur 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);
}
Cela me donne:
object(DOMElement)#81 (0) {
}
object(DOMElement)#82 (0) {
}
object(DOMElement)#83 (0) {
}
... etc, etc...
Ce que je trouve déroutant est que cela ressemble à chaque élément contient rien (0)! Ce n'est pas le cas mais c'est ma première impression. Donc, je fouillez en ligne et trouve que je peux ajouter nodeValue
pour obtenir quelque chose de ceci:
Zend_Debug::dump($r->nodeValue);
qui me donne:
string(6) "Images"
string(6) "Videos"
string(4) "Maps"
...etc, etc...
Mais où j'ai des ennuis est d'obtenir des éléments spécifiques et leur contenu.
Par exemple donné cette 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>
je peux saisir le texte de chaque newsBlurb, en utilisant la technique que je l'utilise dans l'exemple Google, mais ne peut pas obtenir chaque élément par lui-même. Je veux obtenir la date et la coller quelque part, obtenir le texte du titre et le coller quelque part et obtenir le lien à utiliser. Mais tout ce que je reçois est le texte réel dans la div.
Comment puis-je obtenir ce que je veux?
EDIT Voici un autre exemple qui ne fonctionne pas comme je l'attends. Des idées pourquoi?
$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);
cela me donne:
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 ')]"
}
Essayer d'obtenir quoi que ce soit de ce que j'ai utilisé:
$children = $newsBlurbNode->childNodes;
foreach ($children as $child) {
}
qui se traduit par une erreur, car la boucle de foreach n'a rien en elle. Ack! Qu'est-ce que je ne reçois pas?
Thx ... Je vais parcourir la page liée car j'ai vraiment besoin de comprendre cela. – Lothar
Je suis confus ici ... Je ne reçois toujours pas les résultats que j'attends. Si vous avez le temps de lire mon édition ci-dessus, je l'apprécierais. – Lothar
Ouais ça ne marchera pas parce que Zend_Dom_Query_Result n'a pas de childnodes. Vous devrez trouver comment convertir Zend_Dom_Query_Result en un objet DOM, puis vous pourrez le parcourir. – wajiw