使用mechanize从HTML表中提取数据

首先,这是示例html表:

 Kangchenjunga  8,586m
28,169ft
Nepal/India
1955; G. Band, J. Brown

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

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

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

我有以下内容,如果我在html文档的正文中有ARGV [0],则打印“ok”。 如何搜索找到ARGV [0]的同一行的最后一列?

示例:

  GIVE THIS AS A PARAMETER  SKIP THIS
SKIP THIS
SKIP THIS
I WANT IT TO RETURN THIS

我是Ruby的新手

更多的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 

我相信这就是你想要的(你需要gem安装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 

我看到的第一个错误就是你打电话给以下人:

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

不幸的是,从mechanize对象中抓取正文将返回所有正文文本,就像在DOCTYPE主体块中找到的一样。

这个信息非常烦人,所以我建议你做以下几点。 p=Mechanize.new.get('http://www.alpineascents.com/8000m-peaks.asp')

这将返回您正在玩的Mechanize#Page对象( http://mechanize.rubyforge.org/Mechanize/Page.html

通过该对象,我们可以通过执行以下操作简单地执行nokogiris搜索的搜索;

elems = p.search('tr')

这将返回所有tr元素作为Nokogiri :: XML :: Element,我们可以非常干净地使用它来获取我们想要的信息。 请注意,您可能想要使用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"