首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复杂Xpath获取不包括某些特定类属性的所有值。

复杂Xpath获取不包括某些特定类属性的所有值。
EN

Stack Overflow用户
提问于 2020-01-24 03:32:17
回答 1查看 233关注 0票数 1

我有一个标记HTML如下:

代码语言:javascript
复制
<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>

我尝试“使用class="entry-content"进入div,从它的子节点获取所有文本,不包括带有class= "code1", "code2", "codex1", "codex2"的子节点

下面的代码将转到div,并从子节点获取所有文本。但是,我不能从带有code1和code2的子节点中删除文本。感谢你的支持。谢谢。

代码语言:javascript
复制
 $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...

标题

text2

text3

text4

text5

text6

text7

text8

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-24 10:07:50

您的输入文档格式不正确,</p缺少一个div,并且没有正确关闭一个div。在固定输入文档后,工作路径表达式为

XPath表达式

代码语言:javascript
复制
//div[@class='content']//text()[not(ancestor::div/@class[contains(., 'code')])][normalize-space()]

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

输出

单独的结果由------分隔

代码语言:javascript
复制
 title 
-----------------------
 text
-----------------------
 text2 
-----------------------
 text3 
-----------------------
 text4 
-----------------------
 text5
-----------------------
 text6 
-----------------------
 text7 
-----------------------
 text8 

更新

,我试过了你的答案。它的工作,但我仍然需要一个来源从img标签。我怎么才能拿到呢?

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

代码语言:javascript
复制
//div[@class='entry-content']/p/img/@source

更新2

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

代码语言:javascript
复制
//div[@class='entry-content']//text()[not(ancestor::div/@class[contains(., 'code')])][normalize-space()] | //div[@class='entry-content']//p/img/@src
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59890059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档