问题描述
我正在用ruby写一个方法,使用nokogiri刮取Wikitable的每个字母。此方法在我的Scraper类中。我只想要“字母”行中的字符。
到目前为止,这是我的代码:
def self.scrape_tables
url = "https://en.wikipedia.org/wiki/English_alphabet"
doc = HTTParty.get(url)
parsed_doc = Nokogiri::HTML(doc)
# capture each row
rows = parsed_doc.css('table.wikitable tr')
letters = rows.css('td a')
# add each letter to letters_array
letters_array = []
letters.map do |letter|
letter_name = letter.name
letters_array.push(letter)
end
binding.pry
end
当我在binding.pry中键入以下内容时,看来我正在抓取正确的标签
puts letters
一旦我弄清楚了如何选择字符,那么我将能够适当地填充letters_array。
.css选择器方法中是否缺少某些内容?谢谢!
干杯
解决方法
代码中有一个小错误,它是letter
而不是letter_name
推送的。
这应该有效:
def self.scrape_tables
url = "https://en.wikipedia.org/wiki/English_alphabet"
doc = HTTParty.get(url)
parsed_doc = Nokogiri::HTML(doc)
# capture each row
rows = parsed_doc.css('table.wikitable tr')
letters = rows.css('td a')
# add each letter to letters_array
letters_array = []
letters.map do |letter|
letter_name = letter.name
letters_array.push(letter_name)
end
end
如果要获取标签内的实际文本值,则需要执行letter_name = letter.text
更新以获取第一列中的所有字母:
要从第一列获取所有唯一值,需要使用first-child
,并且您需要强制td元素具有标签,否则应
包括一些包含引用的rowspan行。
parsed_doc.css('table.wikitable tr td:first-child > a').map(&:text)
=> ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]