猿问

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

我有一个标记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


萧十郎
浏览 85回答 1
1回答

炎炎设计

您的输入文档格式不正确,缺少 a,并且一个文档未正确关闭。固定输入文档后,工作路径表达式为></pdivXPath 表达式//div[@class='content']//text()[not(ancestor::div/@class[contains(., 'code')])][normalize-space()]它选择所有文本节点,但前提是它们没有具有值包含“代码”的属性的祖先元素,并且所选的文本节点不能仅包含空格。divclass输出单个结果由以下部分分隔:------&nbsp;title&nbsp;-----------------------&nbsp;text-----------------------&nbsp;text2&nbsp;-----------------------&nbsp;text3&nbsp;-----------------------&nbsp;text4&nbsp;-----------------------&nbsp;text5-----------------------&nbsp;text6&nbsp;-----------------------&nbsp;text7&nbsp;-----------------------&nbsp;text8&nbsp;更新我试过了你的答案。它的工作原理,但我仍然需要来自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
随时随地看视频慕课网APP
我要回答