如何使用 nokogiri 抓取 wikitable 中的字符文字?

How do I scrape the character literal in a wikitable using nokogiri?

我正在 ruby 中编写一个方法,使用 nokogiri 抓取 wikitable 的每个字母。这个方法在我的Scraper class。我只想要 'Letter' 行中的字符。

到目前为止,这是我的代码:

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

我可以在 标签中看到我想要的所有字符。但是,它不是字面字符。

一旦我弄清楚如何 select 这个字符,我就可以适当地填充 letters_array。

我在 .css selector 方法中遗漏了什么吗?谢谢!

干杯,

代码中有一个小错误,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

如果你想获取a标签内的实际文本值,你需要做letter_name = letter.text

更新以获取第一列中的所有字母:

要从第一列中获取所有唯一值,需要使用 first-child,并且您需要强制 td 元素具有标签,否则它 包括一些行跨度包含引用的行。

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"]