为了账号安全,请及时绑定邮箱和手机立即绑定

复杂 Xpath 获取除某些特定类属性之外的所有值

复杂 Xpath 获取除某些特定类属性之外的所有值

PHP
萧十郎 2022-08-19 10:44:12
我有一个标记HTML,如下所示:<body>    <div>......</div>    ............    <div class="entry-content">        <div class="code1 code2">(ads.....);</div>        <p><img src="https://www..."></img></p>        <h2> title </h2>        <div class="code1-block code2">(ads.....);</div>        <div class="data1 dta-ta1">              <ul><li><p> text</p></li>                  <li><span> text2 </span></li>                  <li><span> text3 </span></li>                  <div class="codex1 code-block"><span>(ads ....); </span></div>                  <li><span> text4 </span></li>                  <div class="codex1 code-block"><span>(ads ....); </span></div>              </ul>        </div>         <div class="codex2-block code2">(ads.....);</div>        <div class="data2-entry dta-ta2">              <p>                <span> text5</span>              </p>              <p> text6 </p>              <p> text7 </p              <div class="codex1 code-block"><span>(ads ....); </span></div>              <li><span> text8 </span></li>              <div class="codex1 code-block"><span>(ads ....); </span></div>        </div>  </div></body>我试图“进入div,从其子节点获取所有文本,不包括子节点class="entry-content"class= "code1", "code2", "codex1", "codex2"我的代码如下,只是转到div并从子节点获取所有文本。但是,我无法使用code1和code2从子节点中删除文本。感谢您的支持。谢谢。 $classname='entry-content'; $a = new DOMXPath($dom); $query = "//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]"; $list = $a->query($query); if ($list->length > 0) {    foreach ($list as $element) {        $nodes = $element->childNodes;          foreach ($element as $node) {             $bodytext = trim(preg_replace('/[\r\n]+/', ' ', $node->nodeValue));             $bodyContent .= '<p>' . $bodytext . '</p>';          }    } }我的预期输出:https://www...标题文本 2文本3文本4文本5文本6文本7文本8
查看完整描述

1 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

您的输入文档格式不正确,缺少 a,并且一个文档未正确关闭。固定输入文档后,工作路径表达式为></pdiv


XPath 表达式


//div[@class='content']//text()[not(ancestor::div/@class[contains(., 'code')])][normalize-space()]

它选择所有文本节点,但前提是它们没有具有值包含“代码”的属性的祖先元素,并且所选的文本节点不能仅包含空格。divclass


输出


单个结果由以下部分分隔:------


 title 

-----------------------

 text

-----------------------

 text2 

-----------------------

 text3 

-----------------------

 text4 

-----------------------

 text5

-----------------------

 text6 

-----------------------

 text7 

-----------------------

 text8 

更新


我试过了你的答案。它的工作原理,但我仍然需要来自img标签的来源。我怎样才能得到它?


也可以选择元素的属性,但这会使 Xpath 表达式更加复杂。您只需添加另一行 PHP 来计算单独的路径表达式,例如:sourceimg


//div[@class='entry-content']/p/img/@source

更新 2


虽然我绝对不建议使用此表达式(因为它会混淆您的代码),但下面介绍如何使用联合运算符将两个表达式组合成一个表达式:


//div[@class='entry-content']//text()[not(ancestor::div/@class[contains(., 'code')])][normalize-space()] | //div[@class='entry-content']//p/img/@src


查看完整回答
反对 回复 2022-08-19
  • 1 回答
  • 0 关注
  • 83 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信