Versión: 2.x
Descargas: enviar_formulario.zip.
mechanize (el proyecto en SourceForge) es un módulo basado en urllib2
que permite el fácil manejo de URLs, navegación, cookies y más. Debido a los grandes cambios que sufrió el paquete estándar en relación a la navegación web, hasta el momento, se mantiene compatible únicamente con la verión 2.x de Python.
A continuación se muestra cómo hacer uso de mechanize
para rellenar la información de un formulario HTML y enviar los datos del mismo.
submit.py
#!/usr/bin/env python # -*- coding: utf-8 -*- from mechanize import Browser print("Enviando formulario...") # Crear navegador. browser = Browser() # Abrir URL. browser.open("http://localhost:8000/index.py") # Seleccionar el formulario. form = browser.select_form("contact") # Rellenar los campos. browser["name"] = "Recursos Python" browser["email"] = "contacto@recursospython.com" browser["message"] = "Hola mundo" # Enviar. response = browser.submit() # Imprimir respuesta. print(response.read()) print("Enviado.")
Como se puede observar, es de sencillo uso y eficaz. Se crea una instancia de mechanize.Browser
y se indica una determinada dirección de URL. A través de la función Browser.select_form
se determina el nombre del formulario con el que se desea trabajar. Luego, de manera similar a un diccionaro, se indican los valores de los campos de información. Por último, se utiliza Browser.submit()
para enviar los datos y se imprime la respuesta.
Los nombres de los campos y el del formulario se encuentran definidos en el código HTML, a través del atributo name
. Por ejemplo:
<form name="contact" method="post" action="index_post.py"> Nombre: <input name="name" type="text" /><br /> Email: <input name="email" type="text" /><br /> Mensaje: <textarea name="message"></textarea><br /> <button type="submit">Enviar</button> </form>
El ejemplo anterior funciona en conjunto con los siguientes scripts CGI, que imprimen el código HTML necesario para ejecutar el código. Para comprender los siguientes códigos de fuente, véase Introducción al desarrollo web vía CGI.
index.py
#!/usr/bin/env python # -*- coding: utf-8 -*- print("Content-Type: text/html") print("") print( """<html> <h3>Formulario</h3> <form name="contact" method="post" action="index_post.py"> Nombre: <input name="name" type="text" /><br /> Email: <input name="email" type="text" /><br /> Mensaje: <textarea name="message"></textarea><br /> <button type="submit">Enviar</button> </form> </html>""" )
index_post.py
#!/usr/bin/env python # -*- coding: utf-8 -*- from cgi import FieldStorage print("Content-Type: text/plain") print("") form = FieldStorage() name, email, message = (form["name"].value, form["email"].value, form["message"].value) print("""Formulario enviado. Nombre: %s. Email: %s. Mensaje: %s. """ % (name, email, message) )
server.py
#!/usr/bin/env python # -*- coding: utf-8 -*- from BaseHTTPServer import HTTPServer from CGIHTTPServer import CGIHTTPRequestHandler class Handler(CGIHTTPRequestHandler): cgi_directories = ["/"] httpd = HTTPServer(("", 8000), Handler) httpd.serve_forever()
El archivo index.py
imprime el código HTML que contiene el formulario en cuestión. index_post.py
recibe los datos enviados y los imprime como texto plano. server.py
es el servidor CGI quien se encarga de procesar las peticiones.
Curso online 👨💻
¡Ya lanzamos el curso oficial de Recursos Python en Udemy!
Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter
en 2024.
Consultoría 💡
Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.
magdaleno says:
Y si el campo no tiene name , si no que solo una clase?
Recursos Python says:
Hola, calculo que te referís al formulario, que puede no tener un nombre. Los campos siempre tienen un nombre. En el primer caso, no hay una forma directa de seleccionar un formulario a partir de la clase. Deberías chequear las versiones más recientes que sí permiten eso: https://github.com/python-mechanize/mechanize.
Saludos