2012-10-09 21 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