2014-02-18 53 views
2

我是新来引入nokogiri到目前为止最熟悉CSS选择器机械化CSS选择,我想从表剖析信息,下面是桌子的样品,我正在使用的代码,我被困在适当的if语句中,因为它似乎返回表的全部内容。引入nokogiri +通过文本

表:

<div class="holder"> 
    <div class ="row"> 
    <div class="c1"> 
    <!-- Content I Don't need --> 
    </div> 
    <div class="c2"> 
    <span class="data"> 
    <!-- Content I Don't Need --> 
    <span class="data"> 
    </div> 
</div> 
... 
<div class="row"> 
    <div class="c1"> 
    SPECIFIC TEXT 
    </div> 
    <div class="c2"> 
    <span class="data"> 
    What I want 
    </span> 
    </div> 
</div> 
</div> 

我的脚本:(如果特定文本在表格中找到返回的每一个“div.c2 span.data”变量 - 所以我要么搞砸了我做循环的知识或者如果语句)

data = [] 
page.agent.get(url) 
page.search('div.row').each do |row_data| 
if (row_data.search('div.c1:contains("/SPECIFIC TEXT/")').text.strip 
    temp = row_data.search('div.c2 span.data').text.strip 
    data << temp 
end 
end 
+0

电流输出为'<! - 内容,我不需要 - >'* N +'我want'什么,预计输出'我want'什么 – Elliott

+0

是..我得到了..请尝试下面的解决方案 –

+0

表中是否可能有多个特定文本?或者你只是在寻找一场比赛? –

回答

4

当您可以在单个CSS选择器中提取所需内容时,无需停止并插入ruby逻辑。

data = page.search('div.row > div.c1:contains("SPECIFIC TEXT") + div.c2 span.data') 

这将只包括那些匹配选择器(例如按照特定文本)。

这里就是你的逻辑可能出现了问题:

此代码

if (row_data.search('div.c1:contains("SPECIFIC TEXT")'... 
    temp = row_data.search('div.c2 span.data')... 

首先搜索该行针对特定的文本,那么如果它匹配,返回匹配第二个查询的所有行,其中有相同的起点。关键是上面的CSS选择器中的+,它将返回紧接在后面的元素(例如下一个兄弟元素)。当然,我正在做一个假设,即下一个元素总是你想要的。

+1

是..你需要有'+'有..现在,它会工作。 –

+0

我加入了'+'和它的工作完美,谢谢 – Elliott

2

我做

require 'nokogiri' 

html = <<_ 
<div class="holder"> 
    <div class ="row"> 
    <div class="c1"> 
    <!-- Content I Don't need --> 
    </div> 
    <div class="c2"> 
    <span class="data"> 
    <!-- Content I Don't Need --> 
    <span class="data"> 
    </div> 
</div> 
<div class="row"> 
    <div class="c1"> 
    SPECIFIC TEXT 
    </div> 
    <div class="c2"> 
    <span class="data"> 
    What I want 
    </span> 
    </div> 
</div> 
</div> 
_ 

doc = Nokogiri::HTML(html) 
css_string = 'div.row > div.c1[text()*="SPECIFIC TEXT"] + div.c2 span.data' 
doc.at(css_string).text.strip 
# => "What I want" 

如何选择那些会在这里工作 -

+0

本来我'TEMP = doc.at_css( 'div.row> div.c1:包含( “特定文字”)+ div.c2 span.date') 。文本。strip',我得到了一个未定义的方法'at_css'错误来自Mechanize – Elliott

+0

@Elliott我在这里特意使用'at_css',如果你想搜索多个节点,使用'#css'。 –

+0

@Arup,并非所有的Nokogiri方法都可以从Mechanize获取。 –