2010-11-30 12 views
5

Zend_Dom'u çok hafif bir ekran kazıma işlemi için kullanmaya çalışıyorum (bir başlık, bazı gövde metinleri ve web sitemdeki küçük bir haber bloğundan bir link almak istiyorum) ve nasıl kullanacağımı bilmiyorum. Bana verdiği DOMElement. Zend_Dom için kılavuzdaZend_Dom size bir DOMElement verir ... nasıl kullanırım?

kod diyor ki:

foreach ($results as $result) { 
    // $result is a DOMElement 
} 

Nasıl bu DOMElement faydalanmak mı?

Ayrıntılı bir örnek (Google'da çapa elemanları arıyor):

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

Bu bana verir: Ne kafa karıştırıcı bulmak her eleman bir şey içeriyor gibi bu görünüyor olmasıdır

object(DOMElement)#81 (0) { 
} 
object(DOMElement)#82 (0) { 
} 
object(DOMElement)#83 (0) { 
} 
... etc, etc... 

(0)! Durum böyle değil, bu benim ilk izlenimim. Bunu internetten etrafında karıştırmak ve ben bu işten bir şey almak için nodeValue ekleyebilir bulmak:

Zend_Debug::dump($r->nodeValue); 

bana verir:

string(6) "Images" 
string(6) "Videos" 
string(4) "Maps" 
...etc, etc... 

Ama derde nerede belirli öğeleri ve içeriklerini oluyor.

Mesela bu html verilen:

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

Ben Google örneğinde kullanmak tekniği kullanılarak, her newsBlurb metin kapmak, ancak kendisi tarafından her bir öğeyi alınamıyor. Tarih almak ve bir yere yapıştırmak, başlık metnini almak ve bir yere yapıştırmak ve bağlantıyı kullanmak istiyorum. Ama tek bildiğim divdaki asıl metindir.

Bundan ne istediğimi nasıl alabilirim?


DÜZENLEME İşte beklediğim gibi çalışmıyor başka bir örnektir. Herhangi bir fikir neden?

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

bu bana verir:

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

kullandığım bu işten bir şey almaya çalışırken: foreach döngüsü içinde hiçbir ilgisi yoktur, çünkü bir hata ile sonuçlanır

$children = $newsBlurbNode->childNodes; 
    foreach ($children as $child) { 
     } 

. Ah! Neyi anlamıyorum?

cevap

2

Tek tek düğümlere erişmek için böyle bir şey kullanabilirsiniz: Aksi takdirde geçip gidebilir

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

: http://php.net/manual/en/class.domelement.php

+0

Thx ... Bunu gerçekten anladığımdan bağlantılı sayfaya gideceğim. – Lothar

+0

Burada kafam karıştı ... Beklediğim sonuçları hala alamıyorum. Düzenlemeyi okumak için zamanınız varsa bunu takdir ediyorum. – Lothar

+0

Evet, bu işe yaramayacak çünkü Zend_Dom_Query_Result'un alt yapısı yok. Zend_Dom_Query_Result öğesinin bir DOM nesnesine nasıl dönüştürüleceğini öğrenmeniz gerekir. Daha sonra, bunun içinden geçebilirsiniz. – wajiw

2

Ben benzer bir şey ile karıştırmasını edilmiştir Hey - Dur eğer bildirin Bu size yardımcı olmak için yeterli - eğer daha fazla açıklayamasam bile.

$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; 
İlgili konular