2017-02-04 133 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"] 

有时有没有一个明确的或容易的道路,但是,通过将问题分解成简单的步骤,它通常会落实到位。