如何在ruby-scraping中拆分-ERROR未定义方法

iecba09b  于 2023-01-25  发布在  Ruby
关注(0)|答案(2)|浏览(70)

我正在抓取网站https://www.bananatic.com/de/forum/games/。我只想提取日期的年份。

require 'nokogiri'
        require 'open-uri'
        require 'pp'
        unless File.readable?('data.html')
        url = 'https://www.bananatic.com/de/forum/games/'
        data = URI.open(url).read
        File.open('data.html', 'wb') { |f| f << data }
        end

        data = File.read('data.html')
        document = Nokogiri::HTML(data)
        links3 = document.css('.topics ul li div')
        re = links3.map do |lk3|
        name = lk3.css('.name').children.text.strip.split("\n")[2]
        end

        date = ' '
        size_dates = re.length
        (0..size_dates).each do |i|
        unless i.nil?
            date = re[i]
            print date
        end
        end

作为执行的结果,我得到了一个字符串形式的日期,格式如下:日.月.年,小时:分钟

***但我只需要年***我进行了拆分,但得到错误。

kq0g1dla

kq0g1dla1#

你的问题是如果你看这个块的输出

re = links3.map do |lk3|
  lk3.css('.name').children.text.strip.split("\n")[2]
end

您将看到:

["              07.08.2016, 13:47", nil, nil, nil, nil, "              06.08.2016, 9:24", nil, nil, nil, nil,...]

因此,您只需将.compact添加到end或将map切换到filter_map,即可解决当前的问题。
这里所说的是解决您的问题的另一种方法:
您可以使用以下命令从该页上的文本中仅获取年份:

require 'nokogiri'
require 'open-uri'

url = "https://www.bananatic.com/de/forum/games/"

doc = Nokogiri::HTML(URI.open(url))

doc
  .xpath('//div[@class="name"]/text()[string-length(normalize-space(.)) > 0]')
  .map {|node| node.to_s[/\d{4}/]}
#=> ["2016", "2016", "2022", "2022", "2022", "2021", "2022", "2017", "2022", "2021", "2019", "2016", "2021", "2021", "2021", "2021", "2020", "2021", "2017", "2021"]

这两个部分是:

  1. //div[@class="name"]/text()[string-length(normalize-space(.)) > 0]-XPath,它查找所有具有类“name”的div,然后拉取非零长度(白色)的文本节点。
  2. .map {|node| node.to_s[/\d{4}/]}-通过基于正则表达式将String切片为4个连续数字,将这些Map到数组中。
    如果您希望XPath与您的帖子一样具体,可以用途:
'//div[@class="topics"]/ul/li//div[@class="name"]/text()[string-length(normalize-space(.)) > 0]'
k4ymrczo

k4ymrczo2#

您可以使用REGEX只获取拥有列表后的年份。
当然,如果你展示的是模式。会起作用的。年份将是唯一一个有4位数的。
例如:2023年1月17日17:40,此\b\d{4}\b将导致2023年。

相关问题