2012-10-09 3 views
0

업데이트 : 소스 코드는 개발자 도구의 내용과 매우 다릅니다.PHP Xpath 스크래핑 가능한 네임 스페이스 문제

체크 아웃 소스 :보기 소스 : HTTP : //www.machinerytrader.com/list/list.aspx ETID = 1 & CATID = 1002

인가를하는 렌더링 할 필요가 자바 스크립트 HTML로 브라우저? 그렇다면 PHP를 어떻게 처리하여 HTML을 파싱 할 수 있습니까? Xpath Checker를 사용하여 내가 찾고있는 항목을 반환 할 수 있지만 (아래 참조) 전체 HTML에는 액세스 할 수 없습니다.

(XPath는 : // 테이블 [(@id 'ctl00_ContentPlaceHolder1')를 포함하고, ((@id "tblContent")를 포함하거나 포함 (@id "tblListingHeader"))])

END의 UPDATE

정기적으로 업무를 위해이 사이트에서 일부 정보를 긁어 내야합니다. 나는이 데이터를 긁기 위해 PHP 코드를 작성하려고 시도하고있다. 나는 네임 스페이스 문제가 여기에 있다고 생각하며, 많은 다른 게시물을 읽었습니다. 나는 이전에 네임 스페이스 문제를 겪어 본 적이 없으며 다른 SO 게시물에 표시된 접근법을 사용하지 않았다. (아무 소용이 없다 :().

xpath 쿼리는 어떠한 이유로도 발생하지 않는 것처럼 보입니다. .이 문제를 처리하는 방법을, 나는 제안을 열고 오전

을 또한 여기 내 코드의 출력은 다음과 같습니다

object(DOMXPath)#2 (0) { 
} 
Debug 1 
array(0) { 
} 
array(0) { 
} 

은 내가 testarray을 위해서 var_dump 작성하고 otherarray 위해서 var_dump 코드의 바닥을 떠났다. DOMXPath 요소의 길이가 0이면 물론 두 배열이 비어 있습니다.

$string = 'http://www.machinerytrader.com/list/list.aspx?ETID=1&catid=1002'; 

$machine_trader = file_get_contents($string); 
$xml = new DOMDocument(); 
$xml->loadHTML($machine_trader); 

$xpath = new DOMXPath($xml); 

$rootNamespace = $xml->lookupNamespaceUri($xml->namespaceURI); 
$xpath->registerNamespace('x', $rootNamespace); 

$tableRows = $xpath->query("//x:table[contains(@id, 'ctl00_ContentPlaceHolder1') and (contains(@id,'tblContent') or contains(@id,'tblListingHeader'))]"); 

var_dump($xpath); 

$testarray = array(); 
$otherarray = array(); 

foreach ($tableRows as $row) 
{ 

     echo "Debug 1"."\n"; 

     $testarray[] = $row->nodeValue; 

} 

답변

1

실제 콘텐츠가 아직 도착하지 않은 양식 게시물에서 발견되는 경우 XPath 문제가 아닙니다. 여기서 JS 소스 코드는 정보 요청에 적절한 '사용자'를 인증 한 다음 양식 제출을 통해 요청을 보냅니다.

소금/암호화 '키'가 무작위로 변경되어 간단한 스크랩을 방지합니다.

JavaScript를 PHP로 다시 작성한 다음 두 가지 요청을 수행하여 인증 과정을 진행할 수 있습니다.

또는 역 공학으로 처리하지 않고 NodeJS로 전환하여 PhantomJS과 같은 것을 사용할 수 있습니다. 자바 스크립트를 평가할 수 있지만 프로그래밍 방식으로 액세스 할 수 있기 때문입니다. 이 작업의 복잡성을 감안할 때 올바른 도구를 사용하는 것이 훨씬 간단합니다.

+0

나는 이것이 대답이 될 것이라고 두려워했다. (NodeJS로 나를 안내해 주셔서 고마워요. – Dedwards