loadHTML返回空,html很好

时间:2015-09-30 18:17:02

标签: php dom domdocument domxpath

我正在尝试使用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

1 个答案:

答案 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"