[英]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.