Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何从Rails和Nokogiri迭代站点页面_Ruby On Rails_Ruby_Nokogiri - Fatal编程技术网

Ruby on rails 如何从Rails和Nokogiri迭代站点页面

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

我正在尝试建立一个信息网站,向访问者显示特定页面上特定商家的所有交易。我设法从第一页抓取标题,并将URL迭代打包到一个数组中

我的代码应该获取每个URL并将其粘贴到scraper中,列出该页面的项目,迭代到下一个页面,刮取标题并将其附加到最近完成的列表中,等等

我的控制器如下所示:

    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 ApplicationControllerURLARY您可以在每次迭代中重新初始化
@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"]