使用 Nokogiri 解析 table
Parsing a table with Nokogiri
我觉得我在这方面一定很接近,但我似乎无法确定正确的 table 名称来获取数据。有人可以快速看一下这个并告诉我哪里出错了吗?很确定我目前没有从 table 变量返回任何数据?
def oddsmath
require 'nokogiri'
tables_data = []
doc = Nokogiri::HTML(open("http://www.oddsmath.com/odds-comparison/"))
doc.css('table#table-odds-comparison.tbl-odds-comparison.tablesorter.tablesorter-default.hasStickyHeaders').each do |table|
# find all rows in the current table, then iterate over the second all the way to the final one...
table.css('tr')[1..-1].each do |tr|
# collect the cell data and raw names from the remaining rows' cells...
raw_name = tr.at('th').text
cell_data = tr.css('td').map(&:text)
# aggregate it...
tables_data += [raw_name, cell_data]
end
end
@output=tables_data
end
如果你查看访问该页面时实际返回的HTML,你会看到table实际上是空的,内容是由JS动态加载的。正因为如此,你不能只用 nokogiri 打开页面来做你想做的事。您需要使用一些允许您控制真实浏览器(或模拟具有 JS 支持的浏览器)的东西,以便在获取页面内容之前页面完全加载,或者您需要弄清楚 URL 页面正在加载 table 的数据,看看您是否可以直接从那里访问它(可能无法访问)。
我觉得我在这方面一定很接近,但我似乎无法确定正确的 table 名称来获取数据。有人可以快速看一下这个并告诉我哪里出错了吗?很确定我目前没有从 table 变量返回任何数据?
def oddsmath
require 'nokogiri'
tables_data = []
doc = Nokogiri::HTML(open("http://www.oddsmath.com/odds-comparison/"))
doc.css('table#table-odds-comparison.tbl-odds-comparison.tablesorter.tablesorter-default.hasStickyHeaders').each do |table|
# find all rows in the current table, then iterate over the second all the way to the final one...
table.css('tr')[1..-1].each do |tr|
# collect the cell data and raw names from the remaining rows' cells...
raw_name = tr.at('th').text
cell_data = tr.css('td').map(&:text)
# aggregate it...
tables_data += [raw_name, cell_data]
end
end
@output=tables_data
end
如果你查看访问该页面时实际返回的HTML,你会看到table实际上是空的,内容是由JS动态加载的。正因为如此,你不能只用 nokogiri 打开页面来做你想做的事。您需要使用一些允许您控制真实浏览器(或模拟具有 JS 支持的浏览器)的东西,以便在获取页面内容之前页面完全加载,或者您需要弄清楚 URL 页面正在加载 table 的数据,看看您是否可以直接从那里访问它(可能无法访问)。