首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有CSS问题的刮表

带有CSS问题的刮表
EN

Stack Overflow用户
提问于 2017-07-28 16:56:09
回答 1查看 168关注 0票数 0

我对一个html表的抓取有个问题。下面是链接:https://www.basketball-reference.com/players/c/curryst01/gamelog/2016 (是的,这是一个著名的Ruby入门教程)。以下是与此相关的代码:

代码语言:javascript
复制
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结构中我遗漏了什么..。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-29 13:38:38

让我们来看看big_table

代码语言:javascript
复制
> big_table.class
 => Nokogiri::XML::NodeSet

> big_table.size
 => 1

因此,首先,对Enumerable#select执行big_table可能不是您所期望的。如果您捕获的是行:

代码语言:javascript
复制
> rows = big_table.css("tr")
> rows.count
 => 87

现在,您可以对行执行select。让我们取一个任意行,看看它包含了什么:

代码语言:javascript
复制
> rows[2].css("td").count
 => 29

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45378778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档