【问题标题】:Xpath query is returning NULLXpath 查询返回 NULL
【发布时间】:2016-10-06 22:36:16
【问题描述】:

我正在尝试维护一些进行网页抓取的 PHP 代码。网页已更改,因此需要更新,但我对 Xpath 的经验并不丰富,所以我很挣扎。

基本上这是相关的html部分

<div class="carousel-item-wrapper">
    <picture class="">
        <source srcset="/medias/tea-tree-skin-clearing-foaming-cleanser-1-640x640.jpg?context=product-images/h3b/hd3/8796813918238/tea-tree-skin-clearing-foaming-cleanser_1-640x640.jpg" media="(min-width: 641px) and (max-width: 1024)">
        <source srcset="/medias/tea-tree-skin-clearing-foaming-cleanser-1-320x320.jpg?context=product-images/h09/h9a/8796814049310/tea-tree-skin-clearing-foaming-cleanser_1-320x320.jpg" media="(max-width: 640px)">
        <img srcset="/medias/myimage.jpg" alt="150 ML" class="">
    </picture>
</div>

我正在尝试从 IMG 标记中提取 srcset 属性,该属性是“/medias/myimage.jpg”的值。我正在使用 XPATH Helper chrome 插件来帮助我,并且我有以下 xpath;

//div[@class="carousel-item-wrapper"]/picture/img/@srcset

在插件中,它返回的正是我所期望的,所以它看起来工作正常。

如果我还使用在线 xpath 测试器http://www.online-toolz.com/tools/xpath-editor.php,那么它也可以正常工作。

但在我的 PHP 代码中,我得到一个空值。

$dom = new DOMDocument();
    $dom->preserveWhiteSpace = false;
    $dom->strictErrorChecking = false;
    $dom->recover = true;

    @$dom->loadHtml($html);
    $xPath = new DOMXPath($dom);        

   //Other xPath queries executed OK.

    $node = $xPath->query('//div[@class="carousel-item-wrapper"]/picture/img/@srcset')->item(0);

    if ($node === NULL)
        writelog("Node is NULL");   // <-- Writes NULL to the log file!

我当然尝试了很多不同的变体,尝试不指定属性名称等。但都没有运气。

我做错了什么?我敢肯定它一定很简单,但我看不出来。

在同一 HTML 文档中使用我的 PHP 代码进行的其他提取工作正常。所以正是这个元素给我带来了麻烦。

【问题讨论】:

  • 您使用哪个 PHP 类来读取/编辑/查询您的 HTML 数据?
  • 您能否补充一些细节,您是如何实例化 $xPath 等的?
  • 你的 HTML 无效,去掉 "loadHtml" 前的 "@",你会看到错误 "Tag source invalid in Entity"。如果你可以编辑 html,你应该为源标签添加自闭合标签
  • @$dom-&gt;loadHtml($html); @,这样你就不会知道它是否失败了——这可能是因为你的HTML无效。
  • @christophe ninja'd :P

标签: php html xpath


【解决方案1】:

PHP 的 DOMXPath 类似乎有自闭标签的问题。如果您要查找自闭合标签,则需要添加双斜杠,因此您的新 xPath 查询应该是:

//div[@class="carousel-item-wrapper"]/picture//img/@srcset

【讨论】:

  • 那行得通。非常感谢,我永远不会发现!
  • 为了其他人的利益:XPath 可以很好地处理自关闭标签。此处描述的内容似乎是针对正在使用的特定 XPath 处理器中的错误的解决方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
  • 1970-01-01
  • 2013-04-28
  • 2019-06-14
  • 2020-01-07
  • 2015-11-12
  • 1970-01-01
相关资源
最近更新 更多