2012-10-09 49 views
0

更新:源代碼與Developer Tools顯示的有很大不同。PHP Xpath刮掉可能的命名空間問題

檢查出源:視圖-出處:http://www.machinerytrader.com/list/list.aspx ETID = 1 & CATID = 1002

是這樣的JavaScript需要由一個呈現瀏覽器轉化爲html?如果是這樣,我怎麼能讓PHP做這個過程,以便我有Html解析?奇怪的是,您可以使用Xpath Checker來返回我正在查找的項目(請參閱下文),但是您無法訪問完整的HTML!

(Xpath的://表[含有(@id, 'ctl00_ContentPlaceHolder1')和(包含(@id 「tblContent」)或含有(@id 「tblListingHeader」))])

END UPDATE

我需要從本網站刮取一些信息以便定期進行工作。我正在嘗試編寫一些PHP代碼來抓取這些數據。我認爲我在這裏有一些命名空間問題,閱讀了SO上的其他一些帖子。我以前從未遇到名稱空間問題,並使用另一個SO帖子中顯示的方法(無效:)。

看來,xpath查詢並不是出於任何原因,如果您有任何猜測或解決方案。如何處理這個問題,我很開放的建議

而且,這裏是我的代碼輸出:

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

我離開了,我的var_dump testarray以及創建和的var_dump otherarray代碼的底部。它們的輸出包含在上面,顯然,如果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這樣的東西,因爲它可以評估JavaScript,但給你的程序訪問。鑑於此任務的複雜性,使用正確的工具會更簡單。

+0

我擔心這將是答案:(感謝指引我到NodeJS ...將考慮它! – Dedwards