簡體   English   中英

Ruby Nokogiri HTML抓取表與CSS問題

[英]Ruby Nokogiri HTML scraping table with CSS issue

我在抓取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一無所知,從4h開始我就在Ruby中)th是標頭的標記,td是標准單元格的標記,tr是一行。 目的是刪除標頭,以便在節點集(nodeset類似於標記的內容?)為空時返回.empty ,這最后一行代碼應僅返回tr元素。 但這是行不通的,實際上結果是[]。
相反,我注意到: big_table.select{|row| row.css("td").empty?}.count big_table.select{|row| row.css("td").empty?}.count等於5 ...因此,我決定這樣做:

big_table = big_table.select{|row| row.css("td").any?} 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

現在,您可以在行上進行select 讓我們來一個任意行,看看它包含什么:

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

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

因此,典型的行包含29個td元素和1 th元素。 實際上,每一行至少有一個th ,這就是為什么css("th").empty? 什么也沒返回。 相反,所有標題行均不包含任何td元素,這就是您嘗試工作的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM