如何使用nokogiri在Wikitable中刮出字符文字?

问题描述

我正在用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"]

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...