2014-05-06 42 views
1

首先,这里是样品HTML表格: 提取数据与机械化

<tr> 
    <td><strong>Kangchenjunga </strong></td> 
    <td>8,586m<br /></td> 
    <td>28,169ft</td> 
    <td><div align="center">Nepal/India </div></td> 
    <td>1955; G. Band, J. Brown </td> 
</tr> 

的ARGV [0]将具有山名(第一colomn)并且返回值应该是最后一列,即第一次爬山的人。

所以我需要检查整行第一列是否是ARGV [0],如果是,那么我应该返回没有日期的最后一列。

require 'mechanize' 
p=Mechanize.new.get('www.alpineascents.com/8000m-peaks.asp').body 
if p.include?('<strong>'+ARGV[0]) 
    puts 'ok' 
end 

我得到以下内容,如果我在html文档的主体中有ARGV [0],就会打印“ok”。 如何搜索同一行中发现ARGV [0]的最后一列?

例:

<tr> 
<td><strong>GIVE THIS AS A PARAMETER </strong></td> 
<td>SKIP THIS<br /></td> 
<td>SKIP THIS</td> 
<td><div align="center">SKIP THIS</div></td> 
<td>I WANT IT TO RETURN THIS</td> 
</tr> 

我真的很新的红宝石

+0

你看创业板引入nokogiri解析您的HTML(http://nokogiri.org/)? –

+0

是的,但我真的不知道如何使用它。 我不知道如何设置搜索条件,获取html表中的行 – Laureant

+0

我会为您发布一个机械化解决方案。它在内部使用nokogiri来解析HTML。它确实提供了一些你不会用nokogiri得到的好方便。我是一个热爱机械化的人,并且会在短时间内把你搞砸。 –

回答

3

更多succint版本更多地依靠的XPath的黑魔法:)

require 'nokogiri' 
require 'open-uri' 

doc = Nokogiri::HTML(open('http://www.alpineascents.com/8000m-peaks.asp')) 
last_td = doc./("//tr[td[strong[text()='#{ARGV[0]}']]]/td[5]") 

puts last_td.text.gsub(/.*?;/, '').strip 
+0

谢谢卡尔曼! 这很酷,代码太短 – Laureant

+0

唯一的问题是,如果ARGV [0]中有一个空格,它将不起作用! – Laureant

+0

修复ARGV [0]中有空格时的错误。 而不是ARGV [0]我写了ARGV.join(“”),所以它将两个或更多的单词连接成一个字符串 – Laureant

2

我相信这是你想要的(你需要创业板安装引入nokogiri)

require 'nokogiri' 
require 'open-uri' 

doc = Nokogiri::HTML(open('http://www.alpineascents.com/8000m-peaks.asp')) 
rows = doc.search('//table')[6]./('tr') 
rows.shift 
rows.shift 

rows.each do |row| 
    if row.text.include? ARGV[0] 
    puts row./('td')[4].text.gsub(/.*?;/, '').strip 
    end 
end 
+0

非常感谢,它的作品! 我是有点好奇这个整体引入nokogiri事情,我发现了一个博客帖子这个: “ - 我们通过在我们想要找到的路径,我们想看看,有一个嵌套​​元素的任何元素元素嵌套在元素中的文本应该等于'AutomationUIGroup'。如果是这样,我们想要获得下一个​​元素的文本值。/text()“ 我有点想做同样的事情,找到第一个​​标签之间的文本,然后返回下一个标签 – Laureant

+0

当然 - 我会将其作为另一个答案 – Kalman

1

第一个错误是什么我看到的是你正在呼叫以下内容:

p=Mechanize.new.get('www.alpineascents.com/8000m-peaks.asp').body

不幸的是,从机械化对象中抓取物体只会返回所有正文文本,就像您在DOCTYPE主体块中找到的那样。

这个信息是相当恼人的解析,所以我会建议做下面的事情。 p=Mechanize.new.get('http://www.alpineascents.com/8000m-peaks.asp')

这将返回一个机械化#Page对象,你用(http://mechanize.rubyforge.org/Mechanize/Page.html

与该对象,我们可以简单地进行搜索是通过执行以下nokogiris搜索的发挥;

elems = p.search('tr')

这将返回所有TR元素的引入nokogiri :: XML ::元素,我们可以使用干净漂亮的拿到我们想要的信息。请注意,您可能想要利用IRB中的所有内容来计算出您需要的内容,但这个想法应该从以下几点明确:

elems.first.search('td').last.text这将从第一个tr元素返回最后的td元素文本我们之前搜索过。

如果您有任何问题/希望我澄清随意问。

我一直在机械化的事情已经很长一段时间了。

编辑:

如果您希望能够查找值这个使用一些说法,这是我所想象当你的价值观哈希填补你你会解决这个问题

values = {} 
elems.each do |e| 
    td = e.search('td') 
    values[td.first.text] = td.last.text 
end 

可以执行以下操作:

如果ARG [0] = “珠穆朗玛峰”

然后

> values["Everest"] => "1953; Sir E. Hillary, T. Norgay"

+0

谢谢哟你为此! 唯一的问题:我可以在哪里添加我的ARGV [0],以便搜索第一个​​的文本? – Laureant

+0

我在想机械化解决方案会为您正在寻找的值建立一个哈希值。我会编辑我的答案,包括我的想法,以便如何轻松,干净地使用我已经布置的当前结构 –

+0

非常感谢Dan! – Laureant