Internamente, Mechanize usa Nokogiri para manejar el análisis del HTML en un DOM. Puede obtener el documento de Nokogiri para que pueda usar accesos XPath o CSS para cavar en una página devuelta.
Esto es cómo conseguir que la URL de redireccionamiento, con sólo Nokogiri:
require 'nokogiri'
html = <<EOT
<html>
<head>
<meta http-equiv="refresh" content="2;url=http://www.example.com/">
</meta>
</head>
<body>
foo
</body>
</html>
EOT
doc = Nokogiri::HTML(html)
redirect_url = doc.at('meta[http-equiv="refresh"]')['content'][/url=(.+)/, 1]
redirect_url # => "http://www.example.com/"
doc.at('meta[http-equiv="refresh"]')['content'][/url=(.+)/, 1]
se descompone en: buscar el primer caso (at
) del descriptor de acceso CSS para la etiqueta <meta>
con un atributo http-equiv
de refresh
. Tome el atributo content
de esa etiqueta y devuelva la cadena siguiente url=
.
Este es un código de Mechanize para un uso típico. Debido a que usted dio ningún código de ejemplo a la mía base sobre la que tendrá que trabajar a partir de esto:
agent = Mechanize.new
page = agent.get('http://www.examples.com/')
redirect_url = page.parser.at('meta[http-equiv="refresh"]')['content'][/url=(.+)/, 1]
page = agent.get(redirect_url)
EDIT: at('META[HTTP-EQUIV=\"Refresh\"]')
Su código de cuenta lo anterior at()
. Observe que está escapando las comillas dobles dentro de una cadena de una sola cita. Eso da como resultado una barra diagonal inversa seguida de una comilla doble en la cadena que NO es lo que usa mi muestra, y es mi primera suposición de por qué está recibiendo el error que es. Nokogiri no puede encontrar la etiqueta porque no hay <meta http-equiv=\"Refresh\"...>
.
EDIT: Mechanize tiene una forma integrada de manejar meta-refresh, mediante el establecimiento de:
agent.follow_meta_refresh = true
También dispone de un método para parse the meta tag y devolver el contenido. A partir de los documentos:
de análisis (contenido, URI)
analiza el retardo y la URL del atributo contenido de una etiqueta meta. Parse requiere el uri de la página actual para inferir una url cuando no se especifica una url. Si se proporciona un bloque, la demora analizada y la url se le pasarán para su procesamiento posterior. Devuelve nil si el retraso y la url no se pueden analizar.
# <meta http-equiv="refresh" content="5;url=http://example.com/" />
uri = URI.parse('http://current.com/')
Meta.parse("5;url=http://example.com/", uri) # => ['5', 'http://example.com/']
Meta.parse("5;url=", uri) # => ['5', 'http://current.com/']
Meta.parse("5", uri) # => ['5', 'http://current.com/']
Meta.parse("invalid content", uri) # => nil
Es muy importante incluir un ejemplo básico del código que está utilizando y las direcciones URL que está accediendo cuando Haz una pregunta. –