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
元素,这就是您尝试的方法起作用的原因。
我对 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
元素,这就是您尝试的方法起作用的原因。