Ruby on rails 如何从Rails和Nokogiri迭代站点页面
我正在尝试建立一个信息网站,向访问者显示特定页面上特定商家的所有交易。我设法从第一页抓取标题,并将URL迭代打包到一个数组中 我的代码应该获取每个URL并将其粘贴到scraper中,列出该页面的项目,迭代到下一个页面,刮取标题并将其附加到最近完成的列表中,等等 我的控制器如下所示:Ruby on rails 如何从Rails和Nokogiri迭代站点页面,ruby-on-rails,ruby,nokogiri,Ruby On Rails,Ruby,Nokogiri,我正在尝试建立一个信息网站,向访问者显示特定页面上特定商家的所有交易。我设法从第一页抓取标题,并将URL迭代打包到一个数组中 我的代码应该获取每个URL并将其粘贴到scraper中,列出该页面的项目,迭代到下一个页面,刮取标题并将其附加到最近完成的列表中,等等 我的控制器如下所示: class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
class Entry
def initialize(title)
@title = title
end
attr_reader :title
end
def scrape_mydealz
require 'open-uri'
urlarray = Array.new
# --------------------------------------------------------------- URL erstellen
pagination = '&page=1'
count = [1, 2]
count.each do |i|
base_url = "https://www.mydealz.de/search?q=media+markt"
pagination = "&page=#{i}"
combination = base_url + pagination
urlarray << combination
end
# --------------------------------------------------------------- / URL erstellen
urlarray.each do |test|
doc = Nokogiri::HTML(open("#{test}"))
entries = doc.css('article.thread')
@entriesArray = []
entries.each do |entry|
title = entry.css('a.vwo-thread-title').text
@entriesArray << Entry.new(title)
end
end
render template: 'scrape_mydealz'
end
end
class ApplicationController URLARY您可以在每次迭代中重新初始化@entriesArray
。最简单的解决方案是将初始化移到循环之外
@entriesArray = []
urlarray.each do |test|
doc = Nokogiri::HTML(open("#{test}"))
entries = doc.css('article.thread')
entries.each do |entry|
title = entry.css('a.vwo-thread-title').text
@entriesArray << Entry.new(title)
end
end
@entriesArray=[]
urlarray.each do | test|
doc=Nokogiri::HTML(打开(“{test}”))
entries=doc.css('article.thread')
条目。每个do |条目|
title=entry.css('a.vwo-thread-title')。文本
@entriesArray这是未经测试的,但这是我用来扫描两个页面的站点并累积标题的一般想法:
require 'open-uri'
BASE_URL = 'https://www.mydealz.de/search?q=media+markt&page=1'
def scrape_mydealz
urls = []
2.times do |i|
url = URI.parse(BASE_URL)
base_query = URI::decode_www_form(url.query).to_h
base_query['page'] = 1 + i
url.query = URI.encode_www_form(base_query)
urls << url
end
@entries_array = []
urls.each do |url|
doc = Nokogiri::HTML(open(url))
doc.css('article.thread').each do |entry|
@entries_array << Entry.new(entry.at('a.vwo-thread-title').text)
end
end
render template: 'scrape_mydealz'
end
请注意,第一个结果连接了
标记的内容。通常不可能在事后将其拆开。thx Nikita,有效。请阅读“”。我们无法运行您的代码并让它显示问题。我们需要最低限度的代码来演示问题,以及复制问题所需的最低限度的输入数据和所需的输出。如果没有这些,我们必须想象数据和结果,这些数据和结果会导致不准确的答案,对任何人都没有帮助。链接到结果对我们或其他人都没有帮助,因为链接会腐烂,然后断开,导致无意义的问题。记住,这不是一个讨论列表,它是一本在线参考书,用于将来为其他人解决问题。我建议学习使用URI类来操作URI。它知道如何处理会引起问题的紧急情况。不要做“#{test}”
test
已经是一个字符串,所以使用它时不要将其插入文本字符串并插入。定义pagination='&page=1'
然后执行pagination=“&page={i}”
;删除第一个,但更好的是,学习使用URI并让它构建查询entry.css('a.vwo-thread-title')。如果找到多个'a.vwo-thread-title'
,文本将导致问题。如果只有一个条目或entry.css(…).map(&:text)
,则使用at(…).text
。
doc = Nokogiri::HTML(<<EOT)
<html>
<body>
<p>foo</p>
<p>bar</p>
</body>
</html>
EOT
doc.search('p').text # => "foobar"
doc.search('p').map(&:text) # => ["foo", "bar"]