2017-07-28 26 views
0

我有一个问题,一个HTML表格的刮。 这里是链接: https://www.basketball-reference.com/players/c/curryst01/gamelog/2016 (是的,这是一个着名的Ruby拼写教程)。 下面是相关的代码:红宝石Nokogiri与CSS问题的HTML抓取表

doc = Nokogiri::HTML.parse(open(link)) 

# Get the biggest table 
big_table = doc.css("table").sort { |x,y| y.css("tr").count <=> x.css("tr").count }.first 

# Number of rows is 87, but there are 5 heads that I wanna remove 
big_table.css("tr").count 

# This doesn't remove heads 
big_table = big_table.select { |row| row.css("th").empty? } 

事实上,在HTML(我什么都不知道HTML,我在Ruby中,因为4H)个是标题标签,TD是一个标准单元,和TR只是一条线。 目标是删除标头,如.empty返回,如果一个nodeset(节点集像是一个标签的内容?)是空的,这最后一行代码应该只返回tr元素。 但它不起作用,实际上结果是[]。
相反,我注意到: big_table.select{|row| row.css("td").empty?}.count等于5 ... 所以,我决定做:

big_table = big_table.select{|row| row.css("td").any?},效果不错...

我的问题是:为什么这条线工作?为什么第一次尝试失败? 也许这是在HTML结构中,我错过了...

谢谢!

+0

我不清楚:你想从页面中提取什么? –

+0

我试图从第一个表中提取数据。这里是教程视频,我正在关注https://www.youtube.com/watch?v=1UYBAn69Qrk&t=560s(从9分20秒开始直到11分20秒)。我完全抄袭了这个人做了什么,并且正如我提到“row.css(td)为空?”线没有做这项工作。谢谢 ! – Eliot

+1

与你的问题无关,寻找最大的表是有趣的(我会使用'max_by'而不是'sort'),你真的只需要找到合适的ID,因为ID是唯一的,即'big_table = doc.css ( “#pgl_basic”)'。 –

回答

1

让我们来看看big_table

> big_table.class 
=> Nokogiri::XML::NodeSet 

> big_table.size 
=> 1 

所以首先,做Enumerable#selectbig_table很可能无法做你的期望。如果您改为捕获这些行:

> rows = big_table.css("tr") 
> rows.count 
=> 87 

现在您可以在行上执行您的select。让我们在任意行,看看它包含:

> rows[2].css("td").count 
=> 29 

> rows[2].css("th").count 
=> 1 

因此,一个典型的行有29种td元素和一个th。实际上每行至少有一个th,这就是为什么css("th").empty?什么都没有返回。相反,所有标题行都不包含任何td元素,这就是您尝试工作的原因。

+0

非常感谢您的解释! :)现在更清晰了。顺便说一句,你知道一个课程.pdf开始与红宝石,nokogiri语言(我真的开始在两种语言)?再次感谢 ! :) – Eliot