【问题标题】:loadHTML returning empty, html is fineloadHTML 返回空,html 没问题
【发布时间】:2015-12-28 15:35:53
【问题描述】:

我正在尝试使用 PHP 获取元素的 href 值,但遇到了一些麻烦。这是我的代码的 sn-p。

  <?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

【问题讨论】:

  • $this-&gt;scraper($request); 如果你的 php 代码真的从这个 scraper 函数。
  • 没有,刮板功能在别处。此代码是另一个函数的一部分。刮板部分工作正常,在其他网站的其他功能中使用没有问题。
  • 它会返回什么?
  • 编辑添加输出:)
  • 对不起,我换个说法:scraper($request) 返回什么?

标签: php dom domdocument domxpath


【解决方案1】:

您应该检查 HTML 是否已加载到 DOM 中。您可以为此使用调试器、日志记录或 var_dump()。

var_dump($dom-&gt;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"

【讨论】:

    猜你喜欢
    • 2014-04-24
    • 2011-03-07
    • 1970-01-01
    • 2011-03-30
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多