gpt4 book ai didi

html - 带有 CSS 问题的 Ruby Nokogiri HTML 抓取表

转载 作者:太空宇宙 更新时间:2023-11-04 08:23:13 25 4
gpt4 key购买 nike

我在抓取 html 表时遇到问题。链接在这里 : 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 在节点集(节点集就像标签的内容?)为空时返回,最后一行代码应该只返回 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

所以首先,针对 big_table 执行 Enumerable#select 可能没有达到您的预期。相反,如果您捕获行:

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

现在您可以对行执行选择。让我们任意一行,看看它包含什么:

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

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

所以一个典型的行有 29 个 td 元素和一个 th。事实上,每一行至少有一个 th,这就是 css("th").empty? 没有返回任何内容的原因。相反,全标题行不包含任何 td 元素,这就是您尝试的方法起作用的原因。

关于html - 带有 CSS 问题的 Ruby Nokogiri HTML 抓取表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45378778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com