Ruby Nokogiri HTML 抓取 table 与 CSS 问题

Ruby Nokogiri HTML scraping table with CSS issue

我对 html-table 的抓取有疑问。 这是 link : https://www.basketball-reference.com/players/c/curryst01/gamelog/2016 (是的,它是 Ruby-scraping 的著名入门教程)。 这是相关的代码:

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一无所知,我从4h开始就在Ruby中)th是header的标签,td是一个标准单元格,而 tr 只是一条线。 目标是删除 header,因此 .empty return 如果节点集(节点集就像标签的内容?)是空的,最后一行代码应该有 return只有tr元素。 但它不起作用,实际上结果是 [] .
相反,我注意到: big_table.select{|row| row.css("td").empty?}.count 等于 5 ... 所以,我决定这样做:

big_table = big_table.select{|row| row.css("td").any?} 效果很好...

我的问题是:为什么这条线有效?为什么第一次尝试失败了? 也许是 HTML 结构中我遗漏的东西......

谢谢!

我们来看看big_table

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

> big_table.size
 => 1

所以首先,Enumerable#select 反对 big_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? 什么也没返回的原因。相反,all-header 行不包含任何 td 元素,这就是您尝试的方法起作用的原因。