PHP Xpath:按类名获取节点值
我使用xpath从一段HTML代码中提取数据,并且我能够提取除一段之外的大部分数据 HTML的结构如下所示,但可能只有一个li或两个li或全部三个li,因此我需要能够通过类名来确定它的目标PHP Xpath:按类名获取节点值,php,xpath,Php,Xpath,我使用xpath从一段HTML代码中提取数据,并且我能够提取除一段之外的大部分数据 HTML的结构如下所示,但可能只有一个li或两个li或全部三个li,因此我需要能够通过类名来确定它的目标 <li> <a href="http://www.website.com">Product URL</a> </li> <li> <ul> <li class="itemone">1</l
<li>
<a href="http://www.website.com">Product URL</a>
</li>
<li>
<ul>
<li class="itemone">1</li>
<li class="itemtwo">2</li>
<li class="itemthree">3</li>
</ul>
</li>
问题是$productPrice
,上面的一行正在拉出下面的节点列表
DOMNodeList Object
(
[length] => 3
)
我想在上面的节点列表中找到类名为itemtwo
的任何东西,我在$productRaw[1]
上使用了$xpath->query
,还尝试了getElementsByClassName
,但运气不好,我尝试了下面的两个片段
$productPrice = $productRaw[1]->getElementsByTagName('li')->getElementsByClassName('itemtwo');
...
$productPrice = $productRaw[1]->query('//li[contains(@class, \'itemtwo\')]');
这两个代码段都给出了一个错误致命错误:调用未定义的方法DOMNodeList::getElementsByClassName()
和致命错误:调用未定义的方法DOMNodeList::query()
类似的内容
$str = '<li>
<a href="http://www.website.com">Product URL</a></li>
<li>
<ul>
<li class="itemone">1</li>
<li class="itemtwo">2</li>
<li class="itemthree">3</li>
</ul>
</li>';
$doc = new DOMDocument;
$doc->loadHTML($str);
$xpath = new DOMXPath($doc);
$productPrices = $xpath->query("//li[@class='itemtwo']");
foreach ($productPrices as $productPrice) {
print $productPrice->nodeValue."\n";
}
$str='
- 1
- 2
- 3
';
$doc=新文档;
$doc->loadHTML($str);
$xpath=新的DOMXPath($doc);
$productPrices=$xpath->query(//li[@class='itemtwo']);
foreach($productPrices作为$productPrice){
打印$productPrice->nodeValue。“\n”;
}
使用DOMXPath::query
,将XPath字符串作为第一个参数传递,将DOMNode
作为第二个参数传递,以相对于特定DOMNode
上下文执行XPath,例如:
foreach($rawData as $data) {
$productRaw = $data->getElementsByTagName('li');
.....
$productPrice = $xpath->query('.//li[contains(@class, "itemtwo")]', $productRaw->item(1));
}
还可以在XPath表达式的开头使用
来明确说明表达式是相对于当前上下文节点的。har07的答案是正确的,但它只返回了长度设置为3的节点列表,就像我已经用现有代码接收到的一样
原始代码:
$productPrice = $productRaw[1]->getElementsByTagName('li');
har07的建议:
$productPrice = $xpath->query('.//li[contains(@class, "itemtwo")]', $productRaw->item(1));
解决方案,返回元素类名等于itemtwo
的节点值:
$productPrice = $xpath->query('.//li[contains(@class, \'itemtwo\')]', $productRaw[1])->item(1)->nodeValue;
请将您尝试过的内容全部发布。@Jon,我已经添加了迄今为止我尝试过的两行内容。我建议简单地使用php库和解析器html dom。这只会给我
DOMNodeList对象,其长度设置为3,就像我最初的问题中的那样。这意味着我误解了您代码的上下文。在发布的HTML代码段中,$productRaw[1]引用了哪个li元素?$productRaw[1]
引用了我的HTML代码段中的第一级li
,它的子级UL
包含3个li
元素,在这3个LI
元素中,我试图将类名为itemtwo
@lana的元素作为目标。在我看来,代码应该可以正常工作,请参见演示:$productRaw
引用了第二个外部li
,并且使用相同的XPath,代码成功地打印了2
的值。使您不会错过xpath开头的
,对上面的解决方案稍加修改即可获得,$productPrice=$xpath->query('.//li[contains(@class,\'itemtow2\')],$productRaw[1])->item(1)->nodeValue代码>
$productPrice = $xpath->query('.//li[contains(@class, \'itemtwo\')]', $productRaw[1])->item(1)->nodeValue;