2012-05-21 5 views
0

나는 비슷한 질문을하지만 나는 여기에 붙어있다. 나는 이것으로 나를 도와 줄 좋은 튜토리얼을 찾을 수 없다. 그러나 내가하고 싶은 것은 매우 기초적이어야합니다. 나는이 얻을 수는 XPath 얻기 위해 크롬을 사용하여, 나는 Stackoverflow.com에 H1 "최고 질문을"잡아하고 싶은 말은하자 :Xpath와 Xpath를 에코하기

//*[@id="h-top-questions"]

그래서 제 질문은이다; 나는 이것을 어떻게 반향합니까? 모든 I이있어 그물 각지에서 코드 조각을 사용하여 :

<?php 
$curl = curl_init('http://stackoverflow.com/'); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10'); 
$html = curl_exec($curl); 
curl_close($curl); 

if (!$html) { 
    die("something's wrong!"); 
} 

//var_dump(strlen($data)); 

$dom = new DOMDocument(); 
@$dom->loadHTML($html); 

$xpath = new DOMXPath($dom); 

$headerh1 = $xpath->query('//*[@id="h-top-questions"]'); 

foreach($headerh1 as $match) { 
    print_r($match);  
} 
?> 

나는이 그냥 출력 <h1 id="h-top-questions">Top Questions</h1>을 것이라고 추측했다. 하지만 대신 DOMElement Object ( ) 이 나옵니다.

누구든지 도와 줄 수 있습니까? 나는 이것을 배우려고 노력하고있다.

답변

1

쿼리 메서드의 결과로 DOMNodeList 요소를 가져옵니다. DOMNodeList item ($ index) 메소드를 통해 노드에 액세스를 시도하십시오.

+1

필자는 print_r ($ match);를 echo $ match-> nodeValue로 변경했다고 생각합니다. "\ n";그리고 지금 그것이 효과가 있습니다, 그것이 당신이 의미하는 것입니까? – Linkjuice57

+0

네, 유일한 차이점은 item ($ index) 메소드 대신 DOMNode를 얻기 위해 노드를 반복하는 것이지만이 경우에는 중요하지 않습니다. – erdeszt

0

이 방법으로 개체의 내용을 보려면 문자열로 변환해야합니다. 이 작업을 수행하고자한다면, 그럴 수 중 하나를 단순히 echo/print을, 또는 같은 문자열로 캐스팅 :

$string = (string) $object; 

객체가 문자열로 변환되면, PHP는이 __toString() 메소드의 호출합니다. 당신이 시도하고 다음과 같은 오류를 얻을 것이다 문자열로 변환 할 때 불행하게도 DOMElement 객체를 정의, 그렇게하지 않습니다이 특정 시나리오에서

Catchable fatal error: Object of class DOMElement could not be converted to string in...

을, 그 주위에 가난한 사람의 일을 사람이 수행 할 수있다 이것은 적은 양의 코드로 simplexml_import_dom() 함수를 사용하여 SimpleXML을 통해 바운스하는 것입니다. SimpleXMLElement 클래스는 asXML() 메소드를 정의하여 XML 문자열로 다시 변환합니다. 그래서 당신이 할 수있는 일은 :

foreach($headerh1 as $match) { 
    $xml = simplexml_import_dom($match); 
    echo $xml->asXML(); 
} 

그러나이 특정 인스턴스에서, 이것은 다음과 같은 출력 결과 :

<h1 id="h-top-questions">&#13; 
     Top Questions &#13; 
    </h1> 

그래서 당신이 볼

이 없었던 거기에 누출 몇 가지 추가 HTML 엔티티가 원래 소스 코드에서. 이것은 DOM과 SimpleXML 사이에서 일어났습니다.
  • html_entity_decode()을 통해 출력을 전달합니다이 극복하기 위해

    , 그것은 할 수있을 것입니다. 이는 잘못된 XML/HTML 출력을 초래할 수 있으므로 좋은 옵션은 아닙니다.

  • DOMElement를 문자열로 변환하는 함수를 롤백하십시오. 이것은 또한 매우 복잡하기 때문에 훌륭한 옵션이 아니며 전체 노드 목록을 성공적으로 검색하려면 여러 단계를 반복해야합니다.

그러나 여기서 유의해야 할 점은 테스트 및 디버깅 이외에는 실제적인 응용 프로그램이 많지 않다는 것입니다. 실제로 부분 문서를 출력하고 싶지는 않습니다.