如何在Nokogiri中指定XPATH或CSS来刮取页面的表数据?

时间:2013-11-26 03:48:45

标签: css ruby xpath nokogiri

我正在尝试使用Nokogiri和Ruby 1.9.3来搜索包含财务数据的页面。

我无法获得正确的XPath或CSS过滤器以获取保存数据的表,然后遍历数据并进行汇编,以便将输出放入CSV文件中:

Date, Company,Symbol,ReportedEPS,Consensus EPS  
20130828,CDN WESTERN BANK,CWB.TO,0.60,0.59

我使用Firebug来获取XPath和CSS数据。 XPath或CSS提取表格的正确格式是什么,然后遍历这些行来组合它们以输出到文件?

require 'rubygems'
require 'mechanize'
require 'nokogiri'
require 'uri'

@agent = Mechanize.new do|a|    
  a.user_agent_alias = "Windows IE 6"
end

url = "http://biz.yahoo.com/z/20130828.html"
page = @agent.get(url)
doc = Nokogiri::HTML(page.body)
puts doc.inspect 

#~ from firebug
#~ xpath        /html/body/p[3]/table/tbody
#~ css      html body p table tbody

2 个答案:

答案 0 :(得分:2)

某些浏览器会在解析/验证/修复传入的HTML时向<tbody>添加<table>。 Firefox是其中一种浏览器。你从Firefox中获取的XPath和CSS表达式是针对HTML所看到的,并且不一定是Nokogiri会看到的HTML。

删除<tbody>并尝试此XPath:

/html/body/p[3]/table

找到桌子。您还可以查看原始HTML,看看表格中是否有id属性或class属性,您可以将其与CSS id#the-id)或类一起使用(.the-class)选择器而不是大的元素路径。

答案 1 :(得分:1)

为了便于阅读,我通常在XPath上使用CSS。这就像我使用的那样:

require 'open-uri'
require 'nokogiri'

URL = "http://biz.yahoo.com/z/20130828.html"
doc = Nokogiri::HTML(open(URL))
table = doc.css('table')[4]

data = table.search('tr')[2..-1].map { |row|
  row.search('td').map(&:text)
}

data
# => [["CDN WESTERN BANK",
#      "CWB.TO",
#      "1.69",
#      "0.60",
#      "0.59",
#      "N/A",
#      "Quote, Chart, News, ProfileReports, Research"],
#     ["Casella Waste Systems, Inc.",
#      "CWST",
#      "71.43",
#      "-0.02",
#      "-0.07",
#      "N/A",
#      "Quote, Chart, News, ProfileReports, Research, Msgs, Insider, Analyst Ratings"],
#     ["Culp, Inc. Common Stock",
#      "CFI",
#      "5.56",
#      "0.38",
#      "0.36",
#      "Listen",
#      "Quote, Chart, News, ProfileReports, Research, Msgs, Insider, Analyst Ratings"],

返回了更多的数据,但这足以显示代码抓取的内容。

完全没有必要使用Mechanize来完成这项任务。除非您需要浏览网站,否则Mechanize对您没有帮助,所以我会选择OpenURI。

另请参阅“How to avoid joining all text from Nodes when scraping”。