2011-02-15 20 views
5

Tengo un problema con Mecanizar.Mecanizar - Cómo seguir o "hacer clic" Meta actualizar en raíles

Cuando se envía un formulario con Mechanize. Llegué a una página con una meta actualización y no hay enlaces.

Mi pregunta es ¿cómo sigo la meta actualización?

He intentado permitir la actualización de metadatos pero luego aparece un error de socket. Muestra código

require 'mechanize' 
agent = WWW::Mechanize.new 
agent.get("http://euroads.dk") 
form = agent.page.forms.first 
form.username = "username" 
form.password = "password" 
form.submit 
page = agent.get("http://www.euroads.dk/system/index.php?showpage=login") 
agent.page.body 

La respuesta:

<html> 
<head> 
    <META HTTP-EQUIV=\"Refresh\" CONTENT=\"0;URL=index.php?showpage=m_frontpage\"> 
</head> 
</html> 

entonces trato:

redirect_url = page.parser.at('META[HTTP-EQUIV=\"Refresh\"]')[ 
    "0;URL=index.php?showpage=m_frontpage\"][/url=(.+)/, 1] 

pero me sale:

 
NoMethodError: Undefined method '[]' for nil:NilClass 
+0

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. –

Respuesta

4

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 
+0

Gracias por su respuesta. Ahora publiqué un código de muestra porque recibí un error. La próxima vez recordaré publicar el código de muestra al principio. –

+0

@Rails beginner ver la edición agregada a mi respuesta. –

+0

@Rails principiante, agregué otra edición que probablemente encuentre interesante. –

Cuestiones relacionadas