ruby-on-rails - Nokogiri/Mechanize 刮板将表单值传递给刮板类

标签 ruby-on-rails nokogiri mechanize

作为一项学习练习,我构建了一个抓取工具来获取 Reddit 的头条新闻。当前的实时示例可以在 here 中找到它还不包括任何用户定义的功能。我想添加一项功能,允许用户通过表单输入输入他们选择的首选 subreddit。如何将 subreddit 附加到我的 RedditScraper 类中指定的 url?例如,我希望基本 url 为“http:reddit.com/r/”,然后用户可以输入“ruby”或他们喜欢的任何 subreddit。这是我的刮刀类:

require 'nokogiri'
require 'open-uri'
require 'mechanize'


class RedditScraper

  def initialize
    @headline = []
    @agent = Mechanize.new
  end

  def fetch_reddit_headlines
    @url = 'http://www.reddit.com/r/'
    mech_page = @agent.get(@url)

    num_pages_to_scrape = 2
    count = 0

    while(num_pages_to_scrape > count)
      page = mech_page.parser

      page.css('a.title').each do |link|
        if link['href'].include?('http')
          @headline << { content: link.content, href: link['href'] }
        else
          @headline << { content: link.content, href: "http://reddit.com" + link['href'] }
        end
      end
      @headline

      count += 1
      mech_page = @agent.get(page.css('.nextprev').css('a').last.attributes["href"].value)
    end

    return @headline
  end
end

这是我的 Controller 操作:
def index
    @fetch_reddit = RedditScraper.new.fetch_reddit_headlines
end 

我的表格部分(我按照示例 here ):
<%= form_tag("/search", method: "get") do %>
<%= label_tag(:q, "Enter a Subreddit (example: ruby):") %>
<%= text_field_tag(:q) %>
<p><%= submit_tag("Retrieve") %></p>
<% end %>

更新:尝试了下面的建议,但现在收到错误:
enter image description here

最佳答案

在您的 Controller 中

def index
  @fetch_reddit = RedditScraper.new.fetch_reddit_headlines(params[:q])
end

在 RedditScraper 中
def fetch_reddit_headlines(subreddit = 'ruby')
  subreddit = 'ruby' if subreddit.nil?
  @url = "http://www.reddit.com/r/#{subreddit}"

  mech_page = @agent.get(@url)
  (...)

在你的表格中
  <%= form_tag("/", method: "get") do %>
  (...)

如果你想在你的表单中使用“/search”,你必须在 routes.rb 中注册一个路径
get  'search'  => 'controller#action'

关于ruby-on-rails - Nokogiri/Mechanize 刮板将表单值传递给刮板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24036500/

相关文章:

python - 在 Python 中使用 Mechanize 填充和提交文本区域

ruby-on-rails - 一起使用 Rails 服务器和 pry/byebug 时终端光标消失

ruby-on-rails - 如何在 rails 3.2 (ActionView::PathSet) 中添加 rails View 路径

当工厂构建/创建新的belongs_to时,Mysql外键约束冲突

ruby - 如何根据特定定义的兄弟内容获取 sibling 的 child

heroku - Mechanize + Sinatra + Heroku : App crashed

javascript - Ember js 如何强制重新加载特定的选定记录?

ruby-on-rails - nokogiri:生产环境中的重定位错误

css - Nokogiri 并从充满 Nokogiri 节点的数组中隔离选择元素

Ruby SSL 错误 - sslv3 警报意外消息