2011-06-15 19 views
10

Me gustaría saber cómo seleccionar las opciones en una forma que está formateado como¿Cómo se seleccionan las opciones en un formulario usando Python?

<td align="left"> 
        <select name="FORM1" id="FORM1" multiple="multiple" size="5"> 
         <option value="Value1">Value1</option> 
         <option value="Value2">Value2</option> 
        </select> 
    </td> 

En este momento, estoy usando mecanizar para conectarse a la página web y atravesar a la página deseada. Esta página tiene muchas formas como FORM1, FORM2, FORM3, etc. con opciones. Me gustaría seleccionar (habilitar) Value1 y luego decirle a la instancia de mechanize que presione el botón de enviar. ¿Cuál sería una manera rápida de habilitar una opción basada en el nombre del formulario?

Respuesta

22

Éstos son algunos ejemplos básicos de uso para que te va:

>>> import mechanize 
>>> br = mechanize.Browser() 
>>> br.open('http://www.w3schools.com/html/html_forms.asp') 

Los formularios tienen un atributo name; a veces está vacío:

>>> [f.name for f in br.forms()] 
['searchform', None, None, None, None, 'input0'] 

Los formularios tienen una secuencia de controles; controles también tienen nombres:

>>> forms = [f for f in br.forms()] 
>>> forms[1].controls[0].name 
'firstname' 
>>> [c.name for c in forms[3].controls] 
['sex'] 

Usted puede obtener una lista de elementos en un control:

>>> forms[3].controls[0].get_items() 
[<Item name='male' id=None type='radio' name='sex' value='male'>, <Item name='female' id=None type='radio' name='sex' value='female'>] 

Para los botones de radio, usted tiene que hacer una sola selección:

>>> forms[3]['sex'] = ['male'] 

Pero la selección debe estar en una lista:

>>> forms[3]['sex'] = 'male' 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Python/2.6/site-packages/mechanize/_form.py", line 2782, in __setitem__ 
    control.value = value 
    File "/Library/Python/2.6/site-packages/mechanize/_form.py", line 1977, in __setattr__ 
    self._set_value(value) 
    File "/Library/Python/2.6/site-packages/mechanize/_form.py", line 1985, in _set_value 
    raise TypeError("ListControl, must set a sequence") 
TypeError: ListControl, must set a sequence 

Por casillas de verificación se puede realizar varias selecciones:

>>> [(c.name, c.get_items()) for c in forms[4].controls] 
[('vehicle', [<Item name='Bike' id=None type='checkbox' name='vehicle' value='Bike'>, <Item name='Car' id=None type='checkbox' name='vehicle' value='Car'>])] 
>>> forms[4]['vehicle'] = ['Bike', 'Car'] 

Puede encontrar más información here (enlace robado de Matt Hempel :).

3

Cuando dice que la página tiene varios formularios, ¿quiere decir que hay múltiples elementos <form> en la página o campos de formulario múltiples (como <select>)?

The Mechanize documentos para python sketch out how to select list items. Aquí está la muestra que proporcionan:

# Controls that represent lists (checkbox, select and radio lists) are 
# ListControl instances. Their values are sequences of list item names. 
# They come in two flavours: single- and multiple-selection: 
form["favorite_cheese"] = ["brie"] # single 

En su caso, el código para seleccionar Value1 se vería así:

form["FORM1"] = ["Value1"] 
+0

Gracias por capturar eso. Corregido –

+0

¿y si la opción es contenido1? formulario ["FORM1"] = ["Value1"] no funciona, ¿cómo manejarlo con "content1"? Gracias – user392412

Cuestiones relacionadas