2010-11-30 8 views
5

私はZend_Domを非常に軽いスクリーンスクレイピング(私は見出し、いくつかの本文テキスト、そして私のウェブサイト上の小さなニュースブロックからのリンクをつかみたい)に使用しようとしています。それが私に与えるDOMElement。 Zend_Domコードの手動でZend_DomはDOMElementを提供しています...どうすれば使用できますか?

は言う:

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

をしかし、私はトラブルに実行します。ここでは、特定の要素とその内容を取得しています。

<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からテキストをつかむことができますが、それ自体で各要素を取得することはできません:たとえば

は、このHTMLを与えられました。私は、日付を取得し、どこかに貼り付ける、見出しのテキストを取得し、どこかにそれを貼り付け、使用するリンクを取得したい。しかし、私が得るのはdivの実際のテキストだけです。

私はこれからどのようにして得ることができますか?


EDIT は、ここで私が期待どおりに動作しない別の例です。なぜどんなアイデア?

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

これは私を与える:

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

foreachループはそれに何も持っていないので、エラーが発生:

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

は、私が使用し、この外の何かを取得しよう。ああ!私は何を得ていないのですか?

答えて

2

あなたは、個々のノードへのアクセスを得るために、このようなものを使用することができます。

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

をそうでなければ、私は通過します:http://php.net/manual/en/class.domelement.php

+0

Thx ...私は実際にこれを理解する必要があるので、リンクされたページを通過します。 – Lothar

+0

私はここで混乱しています...私はまだ私が期待した結果を得ていません。上記の私の編集を読む時間があれば、それを感謝します。 – Lothar

+0

Zend_Dom_Query_Resultには子ノードがないのでうまくいきません。 Zend_Dom_Query_ResultをDOMオブジェクトに変換する方法を調べる必要があります。そして、それをループすることができます。 – wajiw

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; 
関連する問題