我正在尝试使用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
答案 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”。