我正在抓取网站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
作为执行的结果,我得到了一个字符串形式的日期,格式如下:日.月.年,小时:分钟
***但我只需要年***我进行了拆分,但得到错误。
2条答案
按热度按时间kq0g1dla1#
你的问题是如果你看这个块的输出
您将看到:
因此,您只需将
.compact
添加到end
或将map
切换到filter_map
,即可解决当前的问题。这里所说的是解决您的问题的另一种方法:
您可以使用以下命令从该页上的文本中仅获取年份:
这两个部分是:
//div[@class="name"]/text()[string-length(normalize-space(.)) > 0]
-XPath,它查找所有具有类“name”的div,然后拉取非零长度(白色)的文本节点。.map {|node| node.to_s[/\d{4}/]}
-通过基于正则表达式将String切片为4个连续数字,将这些Map到数组中。如果您希望XPath与您的帖子一样具体,可以用途:
k4ymrczo2#
您可以使用REGEX只获取拥有列表后的年份。
当然,如果你展示的是模式。会起作用的。年份将是唯一一个有4位数的。
例如:2023年1月17日17:40,此
\b\d{4}\b
将导致2023年。