2014-12-11 3 views
0

다른 웹 사이트에서 데이터 스크래핑을 배우려고하므로 작은 HTML 파일을 만들려고 시도했습니다.DOMDocument가 빈 데이터를 반환합니다.

domhtml.php :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
    <body> 
     <div id="mango"> 
      This is the mango div. It has some text and a form too. 
      <form> 
       <input type="text" name="first_name" value="Yahoo" /> 
       <input type="text" name="last_name" value="Bingo" /> 
      </form> 

      <table class="inner"> 
       <tr><td>Happy</td><td>Sky</td></tr> 
      </table> 
     </div> 

     <table id="data" class="outer"> 
      <tr><td>Happy1</td><td>Sky</td></tr> 
      <tr><td>Happy2</td><td>Sky</td></tr> 
      <tr><td>Happy3</td><td>Sky</td></tr> 
      <tr><td>Happy4</td><td>Sky</td></tr> 
      <tr><td>Happy5</td><td>Sky</td></tr> 
     </table> 
    </body> 
</html> 

extract.php :

<?php 

$ch = curl_init("http://192.168.0.198/projects/domhtml.php"); 

curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); 

$cl = curl_exec($ch); 


$dom = new DOMDocument(); 
$dom->loadHTML($cl); 
$dom->validate(); 
$title = $dom->getElementById("mango"); 

//var_dump($title);exit; 

//$title = $dom->saveXML($title); 

echo '<pre>'; 
print_r($title); 


?> 

그러나 반환 출력 :

DOMElement Object 
(
) 

비어있는 이유는 무엇입니까? 이것 이외에 무엇이 행해져 야할까요? 나는 또한 PHP Dom not retrieving element 해결책을 시도했다 그러나 동일한 것을 돌려 보낸다.

편집 : 모두들 나에게 말했다 나는이 짓을

확인 : 그래서 지금

$ch = curl_init("http://192.168.0.198/shopclues/domhtml.php"); 

curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); 

$cl = curl_exec($ch); 


$dom = new DOMDocument(); 
$dom->loadHTML($cl); 
$dom->validate(); 
$title = $dom->getElementById("data"); 

//var_dump($title);exit; 

$title = $dom->saveXML($title); 

echo '<pre>'; 
print_r($title); 

그것을 인쇄입니다 : 나는 어떻게 알고 싶어

Happy1 Sky 
Happy2 Sky 
Happy3 Sky 
Happy4 Sky 
Happy5 Sky 

많은 tr 태그가 있으므로 각 변수의 값을 변수에 저장할 수 있습니다. 변수에 값을 저장하기 위해 어떻게 반복 할 수 있습니까?

미리 감사드립니다.

+0

'$ cl'에는'curl_exec()'뒤에 HTML이 들어 있나요? – RichardBernards

+0

'echo $ dom-> saveXML ($ title); 또는'echo $ dom-> saveHTML ($ title);'무엇을 보여 줍니까?'DOMElement'는 네이티브 라이브러리에 대한 래퍼 일 뿐이므로 흔히'print_r'에서 비어있는 것입니다. –

+0

@RichardBernards 예 페이지가 표시됩니다 –

답변

0

기본 "__toString()"를 DOM 클래스의 기능을 지속적으로 개선되었습니다

http://codepad.viper-7.com/hw9UKg

실행 PHP의 다른 버전을 사용하여 위의 코드 조각의 코드, 당신은 차이를 볼 수 있습니다 5.3.3 및 5.4.33.

질문의 두 번째 부분에는 원하는대로 할 수있는 여러 가지 방법이 있습니다. 나는 당신에게 하나를 표시합니다 :

$dom = new DOMDocument(); 
// I used a different URL 
$dom->loadHtmlFile("http://192.168.0.198/shopclues/domhtml.php"); 
$list = $dom->getElementById("data")->childNodes; 

print_r($list->length); // outputs 5 for me. 

$listTraversable 그래서 당신이 루프 위에 값을 얻을 수 있습니다 구현하는 DOMNodeList이다. 자세한 내용은 확인 : 더 복잡한 쿼리의

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

, 당신은 DOMXPath 조사 할 수 있습니다 :

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

또한 당신이 사용할 수있는 모든 기능을 읽을 도움이 될 것입니다 DomDocumentDomNode :

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

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

+0

귀하의 소중한 답변에 감사드립니다. 나는 이것을 시도하고 값 5를 표시한다.'print_r ($ list);을 시도하면'DOMNodeList Object()'가 표시된다. 루프 내에서 어떤 요소를 저장해야하는지 어떻게 알 수 있습니까? –

+0

또한 $ list-> length라고 쓰고 다른 모든 속성은 무엇입니까? 나는'$ list -> ....'라고 말하고 싶습니까? 나는 왜 당신의 대답이 downvoted 모르겠어요. Downvoter는 이유를 설명하십시오. –

+0

DOMNodeList에 대한 링크를 제공했습니다. 해당 페이지의 다른 모든 속성/메소드를 볼 수 있습니다. – ymas

관련 문제