无法获取元素的节点值
Cant get the nodeValue of element
我正在开发一个简单的 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>
我只需要得到第二个<li>
的第5个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
}
您的 XPath 不正确。元素是<li>
,不是<div>
,因为<li>
的class
包含其他值,不能直接比较。试试这个:
((//li[contains(@class,"ReListCent")])[2]/div)[5]/a
此外,DOMXPath::query
returns a DOMNodeList
,因此要访问单个元素,您需要在列表中指定一个索引,使用 [n]
符号或 ->item(n)
。所以你应该使用:
$result = $finder->query('((//li[contains(@class,"ReListCent")])[2]/div)[5]/a')->item(0)->nodeValue;
我制作了一个小演示,展示了在 3v4l.org 上运行的代码的基础知识。
我正在开发一个简单的 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>
我只需要得到第二个<li>
的第5个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
}
您的 XPath 不正确。元素是<li>
,不是<div>
,因为<li>
的class
包含其他值,不能直接比较。试试这个:
((//li[contains(@class,"ReListCent")])[2]/div)[5]/a
此外,DOMXPath::query
returns a DOMNodeList
,因此要访问单个元素,您需要在列表中指定一个索引,使用 [n]
符号或 ->item(n)
。所以你应该使用:
$result = $finder->query('((//li[contains(@class,"ReListCent")])[2]/div)[5]/a')->item(0)->nodeValue;
我制作了一个小演示,展示了在 3v4l.org 上运行的代码的基础知识。