使用mechanize从HTML表中提取数据
首先,这是示例html表:
Kangchenjunga 8,586m 28,169ft Nepal/India1955; 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"