Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP Xpath:按类名获取节点值_Php_Xpath - Fatal编程技术网

PHP Xpath:按类名获取节点值

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

我使用xpath从一段HTML代码中提取数据,并且我能够提取除一段之外的大部分数据

HTML的结构如下所示,但可能只有一个li或两个li或全部三个li,因此我需要能够通过类名来确定它的目标

<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;