无法获取元素的nodeValue

问题描述 投票:-1回答:1

我正在开发一个简单的搜索引擎优化应用程序,通过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>

我只需要得到第二个div的第五个<li>的结果。

示例代码

        $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
        }
php dom xpath domxpath
1个回答
1
投票

您的XPath不正确。元素是<li>,而不是<div>,因为class<li>包含其他值,你无法直接比较它。试试这个:

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

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

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

我做了一个小型演示,展示了在3v4l.org上运行的代码的基础知识。

© www.soinside.com 2019 - 2024. All rights reserved.