2014-04-27 42 views
-1

我正在尝试使用nokogiri来为某些div文本刮页。提取div元素(Nokogiri/XPath/ruby​​)

HTML中的模式看起来像这样。它有数百或div的,这样的格式是这样的:

<div class="thing text-text" data-thing-id="29966403"> 
    <div class="thinguser"><i class="ico ico-water ico-blue"></i> 
    <div class="status">in 7 days 
</div> 
</div> 
<div class="ignore-ui pull-right"><input type="check box" > 
</div> 
<div class="col_a col text"> 
    <div class="text">foobar 
    </div> 
    </div> 
<div class="col_b col text"> 
    <div class="text">foobar desc 
    </div> 
</div> 
</div> 

(约坏格式抱歉)

我只是想抓住ID(数据事-ID),并从每个为col_a文本代码块,使输出的样子:

29966403 foobar 
29964234 barfoo 

下面的代码我现在有不工作:

#!/usr/bin/env ruby 

require 'nokogiri' 
require 'open-uri' 

tids = Array.new 
terms = Array.new 

doc = Nokogiri::HTML(open("http://somewebsite.com/")) 

tids = doc.xpath("//div[contains(@class,'thing')]/data-thing-id()").collect {|node| node.text.strip} 
terms = doc.xpath("//div[contains(@class,'col_b')]/text()").collect {|node| node.text.strip} 

tids.zip(terms).each do |tid.term| 
puts tid+" "+term 
end 

在此先感谢, 克里斯

回答

1

尝试:

tids = doc.xpath("//div[contains(concat(' ', @class, ' '),' thing ')]").collect {|node| node['data-thing-id']} 
terms = doc.xpath("//div[contains(concat(' ', @class, ' '),' col_b ')]").collect {|node| node.text.strip } 

tids.zip(terms).each do |tid, term| 
    puts tid+" "+term 
end 
# => 29966403 foobar desc 

什么上面的代码是干什么用的文档的XPATH分别找每个DIVs that contain the classesthingcol_b的。然后它将每个找到的DIV取出并提取属性data-thing-id或元素中包含的显示文本,并从结果中创建数组。

引入nokogiri支持xpathcss,你可以找到如何通过看各自的单证充分利用这些工具

+0

会有人还跟详细解释一下TIDS和术语分配线在做什么?我试图从

in 7 days
中提取状态数据,但似乎无法完成此操作。另外,我一直在阅读Nokogiri文档,并且在适用于此的示例中没有看到任何内容。我应该阅读xpath文档吗? – user1117603

+0

@ user1117603我已经添加了解释。简短的回答是 - 是的,你应该阅读xpath文档。 –

+0

再次感谢你。 – user1117603