我对一个html表的抓取有个问题。下面是链接:https://www.basketball-reference.com/players/c/curryst01/gamelog/2016 (是的,这是一个著名的Ruby入门教程)。以下是与此相关的代码:
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一无所知,从4小时起就在Ruby中),th是标头的标记,td是标准单元格,tr只是一行。目标是删除标题,以便如果节点集(nodeset类似于标记的内容?)返回.empty。是空的,这最后一行代码应该只返回tr元素。但它不起作用,实际上结果是[]。
相反,我注意到:big_table.select{|row| row.css("td").empty?}.count等于.所以,我决定:
big_table = big_table.select{|row| row.css("td").any?}和它工作得很好..。
我的问题是:为什么这条线行得通?为什么第一次尝试失败了?也许是HTML结构中我遗漏了什么..。
谢谢!
发布于 2017-07-29 13:38:38
让我们来看看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?没有返回任何内容。相反,所有标题行都不包含任何td元素,这就是为什么您尝试的内容有效的原因。
https://stackoverflow.com/questions/45378778
复制相似问题