loadHTML 返回空,html 没问题

loadHTML returning empty, html is fine

我正在尝试使用 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 应该可以工作。但是,当我尝试在加载 HTML 后记录 $dom 时,我得到一个空白结果。我已经苦苦挣扎了几个小时,试图找出原因,但没有成功。

有没有人有任何ideas/anything我可以试试?

编辑以添加控制台输出:

    [30-Sep-2015 13:51:59 America/New_York] dom:
    [30-Sep-2015 13:51:59 America/New_York] setting target url

您应该检查 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() 只能 return 个节点列表。

$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"