首页 文章

PHP Xpath Scrape可能的命名空间问题

提问于
浏览
0

更新:源代码与开发人员工具显示的完全不同 .

查看来源:view-source:http://www.machinerytrader.com/list/list.aspx?ETID = 1&catid = 1002

是javascript需要由浏览器呈现为HTML吗?如果是这样,我怎么能让PHP做这个过程,以便我有解析的Html?很奇怪你可以使用Xpath Checker返回我正在寻找的项目(见下文),但是你无法访问完整的html!

(Xpath:// table [contains(@ id,'ctl00_ContentPlaceHolder1')和(contains(@id,“tblContent”)或contains(@id,“tblListingHeader”))])

结束更新

我需要从本网站上获取一些信息,以便定期工作 . 我正在尝试编写一些PHP代码来抓取这些数据 . 我想我在这里有一些命名空间问题,在SO上阅读了很多其他帖子 . 我之前从未遇到过命名空间问题,并使用了另一个SO帖子上显示的方法(无济于事:()) .

似乎xpath查询不会因任何原因发生 . 如果您对如何处理此问题有任何猜测或解决方案,我愿意接受建议 .

这里是我的代码的输出:

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

我遗漏了代码的底部,我在var_dump testarray和create以及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 回答

  • 1

    这不是一个XPath问题,因为实际内容是从您尚未到达的表单帖子中找到的 . 这里的JS源代码只是为信息请求验证正确的“用户”,然后通过表单提交发送请求 .

    在每个请求中,salt / encryption“key”被随机化并更改,从而防止简单的擦除 .

    您可以将JavaScript重写为PHP,然后发出两个请求,同时与身份验证过程作斗争 .

    或者,您可以将您的抓取切换到NodeJS并使用类似PhantomJS之类的内容,因为它可以评估javascript但是可以为您提供编程访问 . 鉴于此任务的复杂性,使用正确的工具会更简单 .

相关问题