Механизм Ruby Gem выдает ошибку: неопределенный метод `<=> ' - PullRequest
1 голос
/ 02 ноября 2010

Я использую механизму драгоценных камней Ruby, чтобы очистить некоторые HTML ... Когда я загружаю свою страницу и отображаю необходимые результаты, страница выглядит нормально.После перезагрузки я получаю эту ошибку при выполнении "search_results = @ agent.submit (search_form)":

undefined method `<=>' for {emptyelem <input name="hl" value="en" type="hidden">}:Hpricot::Elem

Перед тем, как публиковать какой-либо код, просто звонит ли этот звонок?Спасибо.

Код:

    start = Time.now

    # initial set up
    @agent = Mechanize.new
    Mechanize.html_parser = Hpricot
    page = @agent.get("http://www.google.com/")
    search_form = page.forms.first

    # conduct initial search
    @search_term = search_form.q = params[:search].to_s
    search_results = @agent.submit(search_form)

    # helper variables
    search_qs = ""; @page_number = 1; i = 0; @flag = false;

    # get the query string structure
    search_results.links.each { |li| search_qs = li.href if li.href.match(/.*search\?q=.*start=.*/) }

    # search through all paginated pages
    while (i < 500)
      search_qs = search_qs.gsub(/start=\d+/,"start=#{i}")
      @search_url = "http://google.com#{search_qs}"
      search_results = @agent.get(@search_url)
      search_results.links.each { |li| @flag = true if li.text.match("All Bout Texas Tailgating") }
      break if @flag
      i+=10; @page_number+=1
    end

@execution_time = Time.now-start

render :layout => false

ПРОСМОТР:

<h2>Query results for "<%= @search_term %>" on Google</h2>

<% if @flag %>
    <p>What page is this keyword found: <b><%= @page_number %></b></p>
    <p><%= link_to  "Click to see page", "#{@search_url}", {:target => "_blank"} %></p>
    <p>How long did this query take to run?: <%= @execution_time %> seconds</p>
<% else %>
    <p>Keyword not found in Google search reults</p>
<% end %>

STACK TRACE:

 NoMethodError (undefined method `<=>' for {emptyelem <input name="hl" value="en" type="hidden">}:Hpricot::Elem):
  mechanize (1.0.0) lib/mechanize/form/field.rb:30:in `<=>'
  mechanize (1.0.0) lib/mechanize/form.rb:171:in `sort'
  mechanize (1.0.0) lib/mechanize/form.rb:171:in `build_query'
  mechanize (1.0.0) lib/mechanize.rb:373:in `submit'
  app/controllers/admin/importer_controller.rb:24:in `check_page_rank'
  /opt/local/lib/ruby/1.8/webrick/httpserver.rb:104:in `service'
  /opt/local/lib/ruby/1.8/webrick/httpserver.rb:65:in `run'
  /opt/local/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
  /opt/local/lib/ruby/1.8/webrick/server.rb:162:in `start'
  /opt/local/lib/ruby/1.8/webrick/server.rb:162:in `start_thread'
  /opt/local/lib/ruby/1.8/webrick/server.rb:95:in `start'
  /opt/local/lib/ruby/1.8/webrick/server.rb:92:in `each'
  /opt/local/lib/ruby/1.8/webrick/server.rb:92:in `start'
  /opt/local/lib/ruby/1.8/webrick/server.rb:23:in `start'
  /opt/local/lib/ruby/1.8/webrick/server.rb:82:in `start'

Rendered rescues/_trace (98.4ms)
Rendered rescues/_request_and_response (1.2ms)
Rendering rescues/layout (internal_server_error)

1 Ответ

0 голосов
/ 02 ноября 2010

Так что, если вы просматриваете источник для механизации в form.rb - отправка формы вызывает функцию build_query, которая сортирует поля в форме.Поскольку сортировка использует оператор <=>, и он не определен для элементов Hpricot, вы получаете исключение.

Похоже, что Mechanize был построен для использования Nokogiri - в нем могут быть нефиксированные ошибки с другими реализациями синтаксического анализа.Я не слишком углубился в источник механизации и не хочу никого обвинять, но вы можете попробовать переключиться на Nokogiri для этого проекта (если это возможно).Из этого фрагмента не похоже, что вы сильно полагаетесь на Hpricot.Мне кажется странным, что Mechanize создает исключение для скрытого поля формы из Hpricot, но трассировка стека в этом отношении довольно ясна.

Другой важный вариант - заскочить в механизированный источник и посмотреть, сможете ли вы исправить его самостоятельно (или подать ошибку на механизированном github и надеяться, что кто-нибудь доберется до него).

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...