【问题标题】:Cant get the nodeValue of element无法获取元素的nodeValue
【发布时间】:2019-07-06 19:46:07
【问题描述】:

我正在开发一个简单的 seo 应用程序,该应用程序通过 curl_multi_getcontent 从其他网站获取排名结果。

我的问题是我无法使用 xpath 定位元素的位置。

<div class="mt10">
    <ul class="ResultListWrap">
        <li class="ReListCent RelistHead clearfix"></li>
        <li class="ReListCent RelistHead bor-b1s clearfix">
            <div class="w25-0"></div>
            <div class="w8-0"></div>
            <div class="w8-0"></div>
            <div class="w8-0"></div>
            <div class="w8-0">
                <a href="">Text</a> <!-- GET THE VALUE OF THIS -->
            </div>
            <div class="w8-0"></div>
            <div class="w25-0"></div>
        </li>
        <li class="ReListCent RelistHead bor-b1s clearfix"></li>
        <li class="ReListCent RelistHead bor-b1s clearfix"></li>
        <li class="ReListCent RelistHead bor-b1s clearfix"></li>
        <li class="ReListCent RelistHead bor-b1s clearfix"></li>
        <li class="ReListCent RelistHead bor-b1s clearfix"></li>
        <li class="ReListCent RelistHead bor-b1s clearfix"></li>
        <li class="ReListCent RelistHead bor-b1s clearfix"></li>
        <li class="ReListCent RelistHead bor-b1s clearfix"></li>
        <li class="ReListCent RelistHead bor-b1s clearfix"></li>
    </ul>
</div>

我只需要从第二个&lt;li&gt; 的第五个div 得到结果。

示例代码

        $urlContent = curl_multi_getcontent($url);

        $document = new \DOMDocument('1.0', 'UTF-8');

        // set error level
        $internalErrors = libxml_use_internal_errors(true);
        // load HTML
        $document->loadHTML($urlContent);
        // Restore error level
        libxml_use_internal_errors($internalErrors);

        $finder = new DomXPath($document);
        $results = $finder->query('(//div[@class="ReListCent"])[2]/div[5]/a') -> nodeValue;

        if(isset($results)){

          echo $results;

        }else{
          // NO RESULT
        }

【问题讨论】:

  • 不包含代码作为图像。始终将其作为文本包含在 代码部分 中。这对于创建 minimal reproducible example 至关重要。
  • @zx485 好的,对不起..
  • 查看标记,没有//div[@class="ReListCent"],只有//li[@class="ReListCent"]

标签: php dom xpath domxpath


【解决方案1】:

您的 XPath 不正确。元素是&lt;li&gt;,不是&lt;div&gt;,而且因为&lt;li&gt;class包含其他值,所以不能直接比较。试试这个:

((//li[contains(@class,"ReListCent")])[2]/div)[5]/a

另外,DOMXPath::query 返回一个DOMNodeList,因此要访问单个元素,您需要使用[n] 表示法或-&gt;item(n) 在列表中指定一个索引。所以你应该使用:

$result = $finder->query('((//li[contains(@class,"ReListCent")])[2]/div)[5]/a')->item(0)->nodeValue;

我制作了一个小演示,展示了在 3v4l.org 上工作的代码的基础知识。

【讨论】:

  • 谢谢您,先生,您的帮助..Notice: Trying to get property 'nodeValue' of non-object我收到了这条消息..
  • @user123 如果你print_r($finder-&gt;query('((//li[contains(@class,"ReListCent")])[2]/div)[5]/a'));会发生什么?
  • DOMNodeList Object ( [length] =&gt; 0 ) DOMNodeList Object ( [length] =&gt; 0 ) DOMNodeList Object ( [length] =&gt; 0 ) DOMNodeList Object ( [length] =&gt; 0 )
  • 这意味着 XPath 不匹配。您确定这些元素确实存在于您从 CURL 获得的 HTML 响应中吗?
  • @user123 我添加了一个代码工作的小演示。我在想也许你的页面内容实际上是通过 JavaScript 加载的..