2017-02-04 36 views
-1

我有HTML塊從中我需要提取選擇X以外的所有孩子們的文字:如何從HTML節點

<div class="comment"> 
    <span class="c00"> 
    TEXT 
    <p>text</p> 
    <p>text</p> 
    <div class="reply">reply</div> 
    </span> 
</div> 

注意,「文本」與span class="c00"內沒有HTML標記的文本節點。

如何選擇所有文本沒有div class="reply"

我試過:not操作:

.c00:not(.reply) 

,但沒有奏效。

+1

我會指出在'span'裏放置塊級元素('p'和'div')[通常是皺眉頭](https://www.w3.org/TR/html401 /struct/global.html#h-7.5.3)您應該考慮是否可以/應該更改標記,這會讓您有機會用標記包裝該流氓文本節點,以便更輕鬆地進行選擇。 – Dre

+0

這也是我迄今爲止收集的。我正在將此作爲網站抓取練習的一部分,上面的代碼來自我們正在抓取的網站。 – artze

+2

@Dre:「一般皺眉 - 」這是非常溫和的。 – BoltClock

回答

0

看起來像你不能。只需設置樣式.c00並將其覆蓋在.reply

.c00 { 
 
    color: #F00; 
 
    font-weight: 700; 
 
    font-style: italic; 
 
} 
 
.reply { 
 
    color: #000; 
 
    font-weight: 400; 
 
    font-style: normal; 
 
}
<div class="comment"> 
 
    <span class="c00"> 
 
    TEXT 
 
    <p>text</p> 
 
    <p>text</p> 
 
    <div class="reply">reply</div> 
 
    </span> 
 
</div>

0

這是我想要的使用:

require 'nokogiri' 

doc = Nokogiri::HTML(<<EOT) 
<div class="comment"> 
    <span class="c00"> 
    TEXT 
    <p>text</p> 
    <p>text</p> 
    <div class="reply">reply</div> 
    </span> 
</div> 
EOT 

span = doc.at('span.c00') 
text_nodes = [ span.children.first.text.strip ] 
text_nodes += span.search('p').map(&:text) 
text_nodes # => ["TEXT", "text", "text"] 

有時有沒有一個明確的或容易的道路,但是,通過將問題分解成簡單的步驟,它通常會落實到位。