加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

如何使用PHP在DOMElements上执行XPath查询?

发布时间:2020-12-13 17:57:18 所属栏目:PHP教程 来源:网络整理
导读:我正在尝试对DOMElements进行Xpath查询,但它似乎不起作用.这是代码 html div class="test aaa" div/div div class="link"contains a link/div div/div /div div class="test bbb" div/div div/div div class="link"contains a link/div /div/html 我正在做的
我正在尝试对DOMElements进行Xpath查询,但它似乎不起作用.这是代码
<html>
    <div class="test aaa">
        <div></div>
        <div class="link">contains a link</div>
        <div></div>
    </div>
    <div class="test bbb">
        <div></div>
        <div></div>
        <div class="link">contains a link</div>
    </div>
</html>

我正在做的是这样的:

$dom = new DOMDocument();
$html = file_get_contents("file.html");
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$entries = $xpath->query("//div[contains(@class,'test')]");
if (!$entries->length > 0) {
    echo "Nothingn";
} else {
  foreach ($entries as $entry) {
      $link = $xpath->query('/div[@class=link]',$entry);
      echo $link->item(0)->nodeValue;
      // => PHP Notice:  Trying to get property of non-object
  }
}

一切正常,$xpath->查询(‘/ div [@ class = link],$entry);.我不知道如何在特定的DOMElement($entry)上使用Xpath.

如何在DOMElement上使用xpath查询?

看起来你正在尝试将CS??S选择器与XPath混合使用.您希望使用谓词([…])查看class属性的值.

例如,你的//div.link可能看起来像// div [contains(concat(”,normalize-space(@class),”),’link’)].

其次,在循环中,您尝试使用上下文节点进行查询,然后通过使用绝对位置路径(以斜杠开头)忽略它.

已更新以反映对问题的更改:

你的第二个XPath表达式(/ div [@ class = link])仍然是a)绝对的,而b)的条件不正确.您希望使用具有字符串值link的class属性来请求相对于指定上下文节点($entry)的匹配元素.

所以/ div [@ class = link]应该变成div [@ class =“link”],它搜索$entry元素的子元素(使用.// div […]或descendant :: div [.. .]如果你想更深入地搜索).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读