2010-11-30 4 views
5

아주 가벼운 스크린 스크래핑을 위해 Zend_Dom을 사용하려고합니다. (내 웹 사이트에서 뉴스 항목의 작은 블록에서 헤드 라인, 일부 본문 및 링크를 가져오고 싶습니다.) 어떻게 처리 할 지 잘 모르겠습니다. 그것이 나에게주는 DOMElement. Zend_Dom의 사용 설명서에Zend_Dom은 DOMElement를 제공합니다 ... 어떻게 사용합니까?

코드는 말합니다 :

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

가 어떻게이 DOMElement의 사용을해야합니까?

상세한 예 (구글의 앵커 요소를 찾고이) :

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

은 내가 구글의 예에서 사용하는 기술을 사용하여, 각 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 ')]" 
} 

내가 사용이 밖으로 아무것도 얻을려고 다음 foreach 루프 그것에 아무 상관이 없기 때문에 오류가 발생

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

합니다. 응! 나는 무엇을 얻지 못합니까?

답변

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; 
관련 문제