标签: mechanize-ruby

捕获Mechanize 404 => Net :: HTTPNotFound

我写了一个简单的函数来处理url的获取:

def tender_page_get url, agent
  sleep(rand(6)+2)
  begin
    return agent.get(url).parser
  rescue Errno::ETIMEDOUT, Timeout::Error, Net::HTTPNotFound
    EYE.debug "--winter sleep #{url}"
    puts "-x-#{url}"
    sleep(300)
    tender_page_get url, agent
  rescue => e
    puts "-x-#{url}"
    EYE.debug "--unknown exception"
    EYE.debug "#{url} #{e.inspect}"
  end
end
Run Code Online (Sandbox Code Playgroud)

问题是,即使我Net::HTTPNotFound在第一个救援区中捕获,我仍然在我的日志记录中看到:

--unknown exception
{url} 404 => Net::HTTPNotFound
Run Code Online (Sandbox Code Playgroud)

这意味着第二个救援区抓住了这个例外.可能是什么原因?

ruby http-status-code-404 mechanize-ruby

12
推荐指数
1
解决办法
6484
查看次数

如何让Ruby Mechanize获得一个以字符串形式存在的页面

通常,Mechanize将从URL获取一个网页,get方法的结果是一个Mechanize :: Page对象,您可以从中使用许多有用的方法.

如果页面存在于字符串中,我如何获得相同的Mechanize :: Page对象?

require 'mechanize'

html = <<END_OF_STRING
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<title>Page Title</title>
<style type="text/css">
</style>
</head>
<body>
<h1>This is a test</h1>
</body>
</html>
END_OF_STRING

agent = Mechanize.new

# How can I get the page result from the string html?
#page = ...
Run Code Online (Sandbox Code Playgroud)

ruby mechanize nokogiri mechanize-ruby

12
推荐指数
1
解决办法
2461
查看次数

我无法从Nokogiri解析的字符串中删除空格

我无法从字符串中删除空格.

我的HTML是:

<p class='your-price'>
Cena pro Vás: <strong>139&nbsp;<small>K?</small></strong>
</p>
Run Code Online (Sandbox Code Playgroud)

我的代码是:

#encoding: utf-8
require 'rubygems'
require 'mechanize'

agent = Mechanize.new
site  = agent.get("http://www.astratex.cz/podlozky-pod-raminka/doplnky")
price = site.search("//p[@class='your-price']/strong/text()")

val = price.first.text  => "139 "
val.strip               => "139 "
val.gsub(" ", "")       => "139 "
Run Code Online (Sandbox Code Playgroud)

gsub,strip等等不起作用.为什么,我该如何解决这个问题?

val.class      => String
val.dump       => "\"139\\u{a0}\""      !
val.encoding   => #<Encoding:UTF-8>

__ENCODING__               => #<Encoding:UTF-8>
Encoding.default_external  => #<Encoding:UTF-8>
Run Code Online (Sandbox Code Playgroud)

我正在使用Ruby 1.9.3,因此Unicode不应该是问题.

ruby whitespace mechanize nokogiri mechanize-ruby

7
推荐指数
1
解决办法
3996
查看次数

如何防止错误"找不到代码转换器(UTF-8)"?

我在生产环境(CentOS 5.6)中遇到此错误,但它在开发中运行良好(Ubuntu 11.04).在这两种环境中,该应用程序都使用Ruby 1.9.3和Rails 3.0.9,并配有乘客和nginx.我的机械宝石版本是2.3.

code converter not found (UTF-8)

此代码的最后一行触发它:

mech = Mechanize.new
page = mech.get("http://myurl.com/login.php?login_name=a&password=b")
form = page.form_with(:name => "loginForm")
form.field_with(:name => "active_pgm").value = '1'
page = form.submit
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?config.encoding = "utf-8"我的应用程序确实存在.rb.

ruby encoding ruby-on-rails ruby-on-rails-3 mechanize-ruby

6
推荐指数
1
解决办法
3131
查看次数

Mechanize的getaddrinfo错误

我写了一个脚本,它将遍历我们数据库中的所有客户,验证他们的网站URL是否有效,并尝试在他们的主页上找到推特链接.我们有超过10,000个网址需要验证.如果验证了网址的一小部分,我们就开始为每个网址获取getaddrinfo错误.

以下是抓取单个网址的代码副本:

def scrape_url(url) 
  url_found = false 
  twitter_name = nil 

  begin 
    agent = Mechanize.new do |a| 
      a.follow_meta_refresh = true 
    end 

    agent.get(normalize_url(url)) do |page| 
      url_found = true 
      twitter_name = find_twitter_name(page) 
    end 

    @err << "[#{@current_record}] SUCCESS\n" 
  rescue Exception => e 
    @err << "[#{@current_record}] ERROR (#{url}): " 
    @err << e.message 
    @err << "\n" 
  end 

  [url_found, twitter_name] 
end
Run Code Online (Sandbox Code Playgroud)

注意:我还运行了此代码的一个版本,该版本创建了一个在所有对scrape_url的调用中共享的Mechanize实例.它以完全相同的方式失败了.

当我在EC2上运行它时,它几乎完全通过1,000个URL,然后为剩余的9,000+返回此错误:

getaddrinfo: Temporary failure in name resolution
Run Code Online (Sandbox Code Playgroud)

请注意,我已经尝试使用亚马逊的DNS服务器和谷歌的DNS服务器,认为它可能是一个合法的DNS问题.在这两种情况下,我得到了完全相同的结果.

然后,我尝试在我当地的MacBook Pro上运行它.在为剩余的记录返回此错误之前,它只通过了大约250个:

getaddrinfo: nodename nor servname provided, or not known
Run Code Online (Sandbox Code Playgroud)

有谁知道如何让脚本通过所有记录?

ruby mechanize mechanize-ruby

6
推荐指数
1
解决办法
1645
查看次数

Ruby Mechanize表刮除不捕获整行

我试图用机械化刮一个表网站.我想刮第二排.

当我跑:

agent.page.search('table.ea').search('tr')[-2].search('td').map{ |n| n.text }

我希望它会刮掉整排.但相反它只是刮擦:["2011-02-17","0,00"]

为什么不抓取行中的所有列,而只是第一列和最后一列?

Xpath: / html/body/center/table/tbody/tr [2]/td [2]/table/tbody/tr [3]/td/table/tbody/tr [2]/td/table/tbody/tr [2]

CSS路径: html体中心表tbody tr td table tbody tr td table tbody tr td table.ea tbody tr td.total

该页面与此类似:

<table><table><table>
<table width="100%" border="0" cellpadding="0" cellspacing="1" class="ea">
<tr>
    <th><a href="#">Date</a></th>
    <th><a href="#">One</a></th>    
    <th><a href="#">Two</a></th>    
    <th><a href="#">Three</a></th>     
    <th><a href="#">Four</a></th>    
    <th><a href="#">Five</a></th>        
    <th><a href="#">Six</a></th>        
    <th><a href="#">Seven</a></th>      
    <th><a href="#">Eight</a></th>
</tr>
<tr>
    <td><a href="#">2011-02-17</a></td>
    <td align="right">0</td>    
    <td align="right">0</td>    
    <td align="right">0,00</td>     
    <td align="right">0</td>    
    <td align="right">0</td>        
    <td align="right">0</td>    
    <td align="right">0</td>        
    <td align="right">387</td>      
    <td …
Run Code Online (Sandbox Code Playgroud)

hpricot ruby-on-rails nokogiri ruby-on-rails-3 mechanize-ruby

5
推荐指数
1
解决办法
5726
查看次数

Ruby Mechanize:关注链接

在Ruby上的Mechanize中,我必须为每个新页面分配一个新变量.例如:

  page2 = page1.link_with(:text => "Continue").click
  page3 = page2.link_with(:text => "About").click
  ...etc
Run Code Online (Sandbox Code Playgroud)

有没有办法在没有变量保持每个页面状态的情况下运行Mechanize?喜欢

  my_only_page.link_with(:text => "Continue").click!
  my_only_page.link_with(:text => "About").click!
Run Code Online (Sandbox Code Playgroud)

ruby mechanize-ruby

5
推荐指数
1
解决办法
8517
查看次数

单击Mechanize中的JavaScript链接

我有这个:

<a class="top_level_active" href="javascript:Submit('menu_home')">Account Summary</a>
Run Code Online (Sandbox Code Playgroud)

我想点击该链接但是在使用link_to时出现错误.

我试过了:

bot.click(page.link_with(:href => /menu_home/))
bot.click(page.link_with(:class => 'top_level_active'))
bot.click(page.link_with(:href => /Account Summary/))
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:NoMethodError:未定义的方法`[]'为nil:NilClass

ruby nokogiri mechanize-ruby

5
推荐指数
1
解决办法
1万
查看次数

将登录表单与 Mechanize 结合使用

我知道 Stackoverflow 上有与此非常相似的帖子,但我似乎仍然无法弄清楚我的尝试出了什么问题。

# login to the site 
mech.get(base_URL) do |page|
  l = page.form_with(:action => "/site/login/") do |f|
    username_field = f.field_with(:name => "LoginForm[username]")
    username_field.value = userName
    password_field = f.field_with(:name => "LoginForm[password]")
    password_field.value = password
    f.submit
  end
end
Run Code Online (Sandbox Code Playgroud)

这是我的错误:

rb:18:in `block (2 levels) in <main>': undefined method `field_with' for nil:NilClass (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

这是 HTML

<div class="bucketbody">

    <div class="form padding10">
    <form id="login-form" action="/site/login" method="post">
        <div class="row">
            <p class="note float_right">Fields with <span class="required">*</span> are required.</p>
            <label for="LoginForm_username" class="required">Email address <span class="required">*</span></label>              <input class="width_66per" autofocus="" …
Run Code Online (Sandbox Code Playgroud)

ruby mechanize mechanize-ruby

5
推荐指数
2
解决办法
5127
查看次数

如何使用 ruby​​ Mechanize gem 抓取需要先登录的网站

我试图学习 ruby​​ Mechanize gem 的用法,从中我可以填写表格并登录网站。但我无法在登录后提取数据。基本上,该网站仅在登录后才显示数据,否则它会显示一些默认字符串。例如:“查看网站”而不是 www.example.com

我尝试编写这段代码:

#code to login
require 'mechanize'
require 'logger'
require 'rubygems'
require 'nokogiri'
require 'open-uri'
require 'zlib'

mechanize = Mechanize.new

login = mechanize.get('website login page')
form = login.forms.first
form['student_email'] = 'email@gmail.com'
form['student_password'] = 'password'
result = form.submit
puts result.code
puts "logged in"

#code to extract
url = 'data_path_url'
    doc = Nokogiri::HTML(open(url))
    paths = doc.css('.college_name a')  #capturing the link to extract.
    paths.each do |path|
        path = path['href']
        path = path.to_s
        page = Nokogiri::HTML(open(path))
        data = page.css('.font11.bold') …
Run Code Online (Sandbox Code Playgroud)

ruby nokogiri mechanize-ruby

5
推荐指数
1
解决办法
4659
查看次数