So senden Sie ein Formular mit einer Get-Aktion mit Robobrowser
-
26-12-2019 - |
Frage
Ich benutze die Robobrowser-Bibliothek, ich bin auf ein Formular gestoßen:
<form action="/results" id="search">
<div class="s_ctr">
<fieldset>
<label class="jaw" for="ln">Search by Name</label><input type="text" placeholder="Search by Name" autocomplete="off" value="" tabindex="1" name="ln" maxlength="255" class="name" id="ln" data-key="true"><span>near</span><label class="jaw" for="loc">Enter City, State</label><input type="text" placeholder="Enter City, State" autocomplete="off" value="" tabindex="2" name="loc" maxlength="255" class="location" id="loc" data-key="true">
</fieldset>
<input type="submit" value="Find Physician" class="orange-btn" tabindex="4" id="btn-submit">
</div>
</form>
Mein Code:
search_form = browser.get_form(id='search')
search_form
search_form.fields['1']= name
search_form.fields['2']= address
# # Submit the form
browser.submit_form(search_form)
browser
Ich erhalte die folgende Fehlermeldung und Rückverfolgung:
Traceback:
File "C:\r1\lib\site-packages\django\core\handlers\base.py" in get_response
114. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\r1\lib\site-packages\django\views\decorators\csrf.py" in wrapped_view
57. return view_func(*args, **kwargs)
File "C:\r1\mlist\ml1\views.py" in ph
48. p = getPhone(A.name,A.address)
File "C:\r1\mlist\ml1\views.py" in getPhone
191. browser.submit_form(search_form)
File "C:\r1\lib\site-packages\robobrowser\browser.py" in submit_form
343. payload = form.serialize(submit=submit)
File "C:\r1\lib\site-packages\robobrowser\forms\form.py" in serialize
225. return Payload.from_fields(include_fields)
File "C:\r1\lib\site-packages\robobrowser\forms\form.py" in from_fields
118. payload.add(field.serialize(), field.payload_key)
Exception Type: AttributeError at /ph/
Exception Value: 'unicode' object has no attribute 'serialize'
Kann dieses Formular mit robobrowser eingereicht werden?
Lösung
Das Problem ist die Art und Weise, wie Sie die Werte der Formularfelder festlegen.Um den Wert eines Feldes zu ändern, schreiben Sie in dessen Feld value
Attribut:
form.fields['ln'].value = name
# Or, as a shortcut...
form['ln'].value = name
Anstatt die Werte der Formularfelder festzulegen, ersetzt Ihr Beispielcode die Felder tatsächlich durch Unicode-Objekte.Laufen form['ln'] = name
legt den Wert des nicht fest ln
feld bis name
;es löschen der ln
feld und ersetzt es durch die name
Zeichenfolge.Wenn das Formular dann versucht, seinen Inhalt zu serialisieren, versucht es, das aufzurufen serialize
methode jedes seiner Felder.Zeichenfolgen definieren diese Methode jedoch nicht, was zu dem Traceback führt, auf das Sie gestoßen sind.