2010-11-30 32 views
5

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?

Répondre

2

Vous pouvez utiliser quelque chose comme ça pour avoir accès aux nœuds individuels:

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

Sinon, je passerais par: http://php.net/manual/en/class.domelement.php

+0

Thx ... Je vais parcourir la page liée car j'ai vraiment besoin de comprendre cela. – Lothar

+0

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

+0

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

2

Hé, je suis de déconner avec quelque chose de semblable - laissez-moi savoir si C'est suffisant pour vous aider - sinon je peux l'expliquer un peu plus.

$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;