Les appels AJAX sont effectués par javascript et mécanize n'a aucun moyen d'exécuter javascript. Mechanize ne regarde que les champs de formulaire sur une page HTML statique et vous permet de remplir les champs &. C'est pourquoi votre recherche vous pointe vers des choses comme Selenium ou Ghost, qui courent sur un vrai navigateur qui peut exécuter javascript.
Il existe une façon plus simple de faire cela! Si vous utilisez les outils de développement sur votre navigateur (par exemple, l'onglet Réseau dans Firefox ou Chrome) et remplissez le formulaire que vous pouvez voir la demande de votre navigateur fait dans les coulisses, même avec AJAX:
cela vous dit:
- Le navigateur fait une demande
POST
- a cette URL:
https://interactive.web.insurance.ca.gov/survey/survey?type=homeownerSurvey&event=HOMEOWNERS
- Avec le formulaire suivant params:
- emplacement = ALAMEDA + ALAMEDA
- coverageType = PROPRIÉTAIRES
- coverageAmount = 150000
- Homeage = New
Vous pouvez utiliser ces informations pour faire la même requête POST en Python :
import urllib.parse, urllib.request
url = "https://interactive.web.insurance.ca.gov/survey/survey?type=homeownerSurvey&event=HOMEOWNERS"
data = urllib.parse.urlencode(dict(
location="ALAMEDA ALAMEDA",
coverageType="HOMEOWNERS",
coverageAmount="150000",
homeAge="New",
))
res = urllib.request.urlopen(URL, data.encode("utf8"))
print(res.read())
Ceci est python3. La bibliothèque requests fournit une API encore plus agréable pour faire des requêtes HTTP.
Modifier: En réponse à vos trois questions:
is it possible for the dictionary that you've created to have more than 1 location and cycle through them using a for loop?
Oui, il suffit d'ajouter une boucle autour du code et passer une valeur différente pour location
chaque fois. Je mets ce code dans une fonction pour rendre le code plus propre, comme ceci:
https://gist.github.com/lost-theory/08786e3a27c8d8ce3839
the results are in a lot of jibberish, so I'd have to find a way to sift through it huh. Like pick out which is which
Oui, le charabia est HTML que vous devrez analyser pour recueillir les données que vous cherchez . Regardez HTMLParser dans la bibliothèque standard de python, ou installez une bibliothèque comme lxml ou BeautifulSoup, qui ont une API un peu plus agréable. Vous pouvez également essayer d'analyser le texte à la main en utilisant str.split
.
Si vous voulez convertir les lignes en python list
s de la table, vous aurez besoin de trouver toutes les lignes qui ressemblent à ceci:
<tr Valign="top">
<td align="left">Bankers Standard <a href='http://interactive.web.insurance.ca.gov/companyprofile/companyprofile?event=companyProfile&doFunction=getCompanyProfile&eid=5906'><small>(Info)</small></a></td>
<td align="left"><div align="right"> N/A</td>
<td align="left"><div align="right">250</div></td>
<td align="left"> </td>
<td align="left">Bankers Standard <a href='http://interactive.web.insurance.ca.gov/companyprofile/companyprofile?event=companyProfile&doFunction=getCompanyProfile&eid=5906'><small>(Info)</small></a></td>
<td align="left"><div align="right"> 1255</td>
<td align="left"><div align="right">500</div></td>
</tr>
Vous voulez faire une boucle sur tous les éléments <tr>
(ligne) , en saisissant tous les éléments <td>
(colonne) à l'intérieur de chaque ligne, puis nettoyez le texte dans chaque colonne (en supprimant ces espaces
, etc.).
Il y a beaucoup de questions sur StackOverflow et des tutoriels sur internet sur comment analyser ou gratter du HTML en python, comme this ou this.
could you explain why we had to do the data.encode line
Sûr! Dans le documentation for urlopen
, il est dit:
data must be a bytes object specifying additional data to be sent to the server, or None if no such data is needed.
La fonction urlencode
retourne une chaîne unicode, et si nous essayons de passer cela en urlopen
, nous obtenons cette erreur:
TypeError: POST data should be bytes or an iterable of bytes. It cannot be of type str.
Nous utilisons donc data.encode('utf8')
pour convertir la chaîne unicode en octets. Vous devez généralement utiliser des octets pour l'entrée & comme lire ou écrire des fichiers sur le disque, envoyer ou recevoir des données sur le réseau comme des requêtes HTTP, etc. This presentation a une bonne explication des octets par rapport aux chaînes Unicode en python et pourquoi vous avez besoin décoder/encoder en faisant des E/S.
Mechanize ne supporte pas JavaScript, et ne supporte donc pas ajax. – mhawke