我正在尝试使用PHP获取元素的href值,但是我遇到了一些麻烦。这是我的代码片段。
<?php
ini_set("log_errors", 1);
ini_set("error_log", "php-error.log");
$target_url = "http://foo.bar";
$request = $target_url;
$html = $this->scraper($request);
$dom = new DOMDocument();
$dom->loadHTML($html);
// Error point - $dom is empty
error_log("dom:");
error_log($dom);
$xpath = new DOMXPath($dom);
error_log("setting target url");
$target_url = $xpath->query("//*[@class='foo_bar']/href");
?>
记录$ html会导致页面的标准完整HTML输出。搜索显示我的xpath应该可以工作。但是,当我尝试在loadHTML之后记录$ dom时,我得到一个空白的结果。我一直在努力寻找原因几个小时,但没有运气。
有没有人有任何我想尝试的想法?
编辑添加控制台输出:
[30-Sep-2015 13:51:59 America/New_York] dom:
[30-Sep-2015 13:51:59 America/New_York] setting target url
答案 0 :(得分:1)
您应该检查HTML是否已加载到DOM中。您可以使用调试器,日志记录或var_dump()。
var_dump($dom->saveXml());
如果没有加载到DOM中,请退后一步并验证刮刀是否提取了HTML。
var_dump($html);
如果HTML已加载到DOM中,您仍需要修复Xpath。我希望href
是一个属性节点。
//*[@class='foo_bar']/@href
您似乎想将其作为字符串值读取,因此请将其转换为:
string(//*[@class='foo_bar']/@href)
仅适用于DOMXpath::evaluate()
,DOMXpath::query()
只能返回节点列表。
$target_url = $xpath->evaluate("string(//*[@class='foo_bar']/@href)");
一个小例子:
$document = new DOMDocument();
$document->loadHtml('<a href="http://example.com">Example</a>');
$xpath = new DOMXpath($document);
var_dump($xpath->evaluate('string(//a[1]/@href)'));
输出:
string(18) "http://example.com"