Rellenar formularios HTML con Python

Hola, tras un tiempo sin publicar hoy vuelvo para explicar como interactuar con formularios HTML usando Python, centrándome en un caso en el que tenemos que enviar una imagen a dicho formulario (aunque podría ser otro tipo de archivo).

Para hacerlo usaremos la librería mechanize que podéis descargar desde aquí.

Ya veréis como es realmente sencillo, así que explicaré lo básico para que cada uno lo use y moldee como necesite.


Lo primeros que tenemos que hacer es importar la librería:

import mechanize

y luego inicializar una variable para usar dicha librería:

br = mechanize.Browser()

Acto seguido indicamos en que url se encuentra el formulario que queremos rellenar:

br.open("http://url-de-ejemplo.com/formulario.php")

Ahora nos podemos encontrar con un problema, generalmente las webs suelen tener un formulario GET que da información de la página, de modo que si encima tienen otro formulario, el que queremos rellenar, tenemos que indicar con cuál queremos comunicarnos. ¿Parece difícil? Pues no lo es, basta con hacer:

br.select_form(nr=1)

dónde nr=1 indica que escocemos el formulario número 1, pues el 0 siempre es el primer formulario GET que he comentado más arriba.

Ahora solo queda seleccionar los datos que queremos enviar. Previamente debemos conocer que campos tiene el formulario, y sus IDs respectivas. Esto puede hacerse mirando el código fuente de la página y detectando el código HTML del formulario.

Pongamos por ejemplo que nuestro formulario tiene 2 campos, "title" y "img".

El modo de asignar los datos que queremos mandar es el siguiente:

br.form['title']='Esto es lo que escribiré en el campo title'

Para la imagen es diferente, no nos sirve un br.form['img']=open('imagen.jpg'), debemos hacerlo de otra manera, que sirve para adjuntar imágenes y otros tipos de archivos:

br.form.add_file(open('path/imagen.jpg'), "image/jpeg", 'imagen.jpg')

En el código de arriba 'path/imagen.jpg' corresponde a la ruta del archivo, "image/jpeg" es el tipo MIME del archivo, es decir, si queremos enviar un txt deberemos cambiarlo y poner "text/plain". La última cadena corresponde al nombre que le queremos dar al archivo.

Bien, ahora ya hemos preparado el envío de los datos al formulario, solo queda el envío, la parte más sencilla. Basta con la línea:

br.submit()

Por último es opcional la línea

print br.response().read()

de esta manera cuando acabe la ejecución, veremos en consola el código html de la página resultante después de haber enviado el formulario.

Esto es todo, he hecho una explicación lo más sencilla posible, veréis que es realmente fácil usar esta librería para interactuar con formularios desde Python.

Así es como queda el código final:
import mechanize
br = mechanize.Browser()
br.open("http://url-de-ejemplo.com/formulario.php")
br.select_form(nr=1)
br.form['title']='Esto es lo que escribiré en el campo title'
br.form.add_file(open('path/imagen.jpg'), "image/jpeg", 'imagen.jpg')
br.submit()
print br.response().read()

Espero que os sea útil, para cualquier duda dejad un comentario.
votar
edit post

Comments

  1. no me funcioona
    -------------------------
    Traceback (most recent call last):
    File "C:\Users\Acc-Had\Desktop\html.py", line 3, in
    br.open("http://facebook.com")
    File "C:\Python27\lib\site-packages\mechanize\_mechanize.py", line 203, in open
    return self._mech_open(url, data, timeout=timeout)
    File "C:\Python27\lib\site-packages\mechanize\_mechanize.py", line 255, in _mech_open
    raise response
    httperror_seek_wrapper: HTTP Error 403: request disallowed by robots.txt

     
  2. Puede que Facebook este bloquendo el acceso, prueba con otra web a ver si ocurre el mismo error.

    Eso de "request disallowed by robots.txt" parece cosa del servidor de Facebook.

     
  3. Me funsiona a medias

     

Publicar un comentario

Hola, si tienes algo que decirnos este es tu sitio.