ruby - 如何进行 Mechanize 多重搜索?

标签 ruby mechanize

我想知道是否可以使用数组进行多个 Mechanize 查询?以下代码减去数组适用于单个但不是多个查询。

require 'nokogiri'
require 'mechanize'

agent = Mechanize.new

#User Agent masking
agent.user_agent_alias = 'Windows Mozilla'

#Array of keywords to search
search = Array.new

search << 'TAICHI 21'
search << 'S56CA'

#Take our search array, insert it into a query
agent.get("http://www.asus.com/Search/?SearchKey=#{search}")

#This handles the url
File.open("results.txt","w") do |f|
    PP.pp(page.links.find_all{|l| l.text =~ /#{search}/i},f)
end

第二次尝试
require 'nokogiri'
require 'mechanize'

agent = Mechanize.new

#User Agent masking
agent.user_agent_alias = 'Windows Mozilla'

#Array of keywords to search
search = [ 'S56CA', 'TAICHI 21' ]

#Take our search array, insert it into a query
agent.get("http://www.asus.com/Search/?SearchKey=#{search}")

File.open("results.txt","w") 

#This handles the url
search.each do |f|
    results.txt << PP.pp(page.links.find_all{|l| l.text =~ /#{search}/i},f)
end

最佳答案

当您搜索 S56CAhttp://www.asus.com/Search/?SearchKey=S56CA ,网站重定向到 http://www.asus.com/Notebooks_Ultrabooks/S56CA/页。这与搜索 TAICHI 21 时不同留在结果页面上。

每一个都是不同的行为,所以代码应该以不同的方式处理每种情况。

我修改了您的原始代码以包含 Mechanize 日志记录,如下所示:

require 'nokogiri'
require 'mechanize'

# Logging 
require 'logger'

mechanize_logger = Logger.new('mechanize.log')
mechanize_logger.level = Logger::INFO

agent = Mechanize.new
agent.log = mechanize_logger

#User Agent masking
agent.user_agent_alias = 'Windows Mozilla'

search_terms = [ 'S56CA', 'TAICHI 21' ]
results_file = File.open( 'results.txt', 'w' )

#Take our search array, insert it into a query
search_terms.each do |search|
  page = agent.get("http://www.asus.com/Search/?SearchKey=#{search}")
  links =  page.links.find_all{ |l| l.text =~ /#{search}/i}
  links.each { |links_text| results_file.write( "#{links_text}\n" ) }
end 
results_file.close

当这段代码运行时,程序的输出就是 ASUS TAICHI 21写入 results.txt .
mechanize.log文件有以下内容,显示了两次搜索的区别:
$ more mechanize.log 
I, [2013-01-30T17:49:49.036790 #2142]  INFO -- : Net::HTTP::Get: /Search/?SearchKey=S56CA
I, [2013-01-30T17:49:53.528281 #2142]  INFO -- : status: Net::HTTPFound 1.1 302 Moved Temporarily
I, [2013-01-30T17:49:53.529388 #2142]  INFO -- : follow redirect to: /Notebooks_Ultrabooks/S56CA/
I, [2013-01-30T17:49:53.530106 #2142]  INFO -- : Net::HTTP::Get: /Notebooks_Ultrabooks/S56CA/
I, [2013-01-30T17:49:53.939353 #2142]  INFO -- : status: Net::HTTPOK 1.1 200 OK
I, [2013-01-30T17:49:54.800423 #2142]  INFO -- : Net::HTTP::Get: /Search/?SearchKey=TAICHI%2021
I, [2013-01-30T17:49:55.269454 #2142]  INFO -- : status: Net::HTTPOK 1.1 200 OK

由于搜索页面有内容Did you mean to search for ,您可以使用它来区分代码中的行为。

关于ruby - 如何进行 Mechanize 多重搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14602953/

相关文章:

javascript - 类似 Greasemonkey 的 Firefox 插件,用于自动浏览

ruby - 如何使用 Mechanize gem 获取网站的所有链接?

ruby - Ruby 应用程序的 Dockerfile - 为什么将 WORKDIR 指定为/usr/src/app

ruby - 简单的 Ruby 程序...需要帮助

ruby - 当引用由不同的对象持有时如何确保文件关闭

perl - 关于 submit() 的 Mechanize 问题

Ruby Mechanize - 无法获取特定的选择列表

python - 302 和 urllib2 丢失 cookie

ruby - ruby 中的 .each 迭代器是否保证每次都对相同的元素给出相同的顺序?

ruby-on-rails - 关于在 Rails 上构建 REST Web 服务的教程或截屏视频