亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

復雜 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 關注
  • 94 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號