2014-01-05 2 views
0

웹 사이트의 정보를 긁어서 오프라인에서 읽을 수 있도록 간단한 PHP를 사용하고 있습니다. 코드가 잘 작동하는 것 같지만 정의되지 않은 동작이 걱정됩니다. 이 사이트는 약간 코딩이 잘되어 있지 않으며 일부 요소는 다른 요소와 동일한 ID를 공유합니다. 나는 getElementById이 위에서 아래로 DOM을 가로 지르며, 내가 필요한 요소가 ID가있는 첫 번째 인스턴스이기 때문에 문제가없는 이유를 상상할 수 있습니다. 이 동작을 보장 할 방법이 있습니까? 이 요소에는 ID를 구분하는 다른 방법이 없으므로 ID로 선택하는 것이 가장 좋은 방법 인 것 같습니다. 나는 아래에서 사용하고있는 코드의 제거 된 예제를 포함시켰다.요소를 공유하는 PHP getElementById 동작

감사합니다.

<?php 

$curl_referer = "http://example.com/"; 
$curl_url = "http://example.com/content.php"; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_USERAGENT, 'Scraper/0.9'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 
curl_setopt($ch, CURLOPT_REFERER, "$curl_referer"); 
curl_setopt($ch, CURLOPT_URL, "$curl_url"); 
$output = curl_exec($ch); 

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

$content = $dom->getElementById('content'); 
echo $content->nodeValue; 
?> 

답변

3

첫 번째 ID를 포함하는 XPath 표현식을 사용해보십시오. 그와 마찬가지로 : //*[@id="content"][1]

PHP 코드는 그렇게 될 것입니다 :

$xpath = new DOMXPath($dom); 
$xpath->query('//*[@id="content"][1]')->item(0)->nodeValue; 

와 팁 : libxml_use_internal_errors(true)를 사용, 당신은 로깅을위한 그들은 후자 잡거나 정리 업 문서를 시도 할 수 있습니다.

편집
이봐, 당신의 코드에서 당신은 UA를 설정하는 "스크레이퍼/0.9", 그 보지 않는 나쁜 웹 사이트를 작성하고 들어오는 요청을 기록하지 않는 대부분의 사람들이 그들의 하지만 UA를 넣는 것은 좋지 않습니다. Chrome의 사용자 에이전트와 같은 브라우저 UA를 두는 것이 좋습니다. 사용자 에이전트를 포함하는 요청을 모니터링하고 볼 경우 해당 사용자 에이전트는 사용자를 차단합니다 (향후) .

+0

XPath를 사용하여 찾지도 못했습니다. 고마워. 편집 : UA에 대한 헤드 감사합니다. – Session