我写了一个简单的函数来处理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)
这意味着第二个救援区抓住了这个例外.可能是什么原因?
通常,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) 我无法从字符串中删除空格.
我的HTML是:
<p class='your-price'>
Cena pro Vás: <strong>139 <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不应该是问题.
我在生产环境(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.
我写了一个脚本,它将遍历我们数据库中的所有客户,验证他们的网站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)
有谁知道如何让脚本通过所有记录?
我试图用机械化刮一个表网站.我想刮第二排.
当我跑:
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
在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) 我有这个:
<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
我知道 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 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)