2016-08-02 5 views
1

Je dois effectuer un raclage sur un site Web après l'envoi d'un formulaire de recherche. Le problème est que lorsque je fais cela via le navigateur, la page ne recharge pas et je ne suis pas redirigé n'importe où: les résultats sont affichés sous le formulaire de recherche sans aucun changement au lien, bien que je puisse les voir dans la "nouvelle" page html Mais quand j'utiliser le code suivant, je ne peux pas voir le html page « nouvelle » qui devrait être dans la réponse (le lien fourni est celui que je suis en train d'essayer de travailler avec):Python3: il ne se passe rien lors de la soumission d'un formulaire via MechanicalSoup

import mechanicalsoup 

def fetchfile(query): 

    url = "http://www.italgiure.giustizia.it/sncass/" 

    browser = mechanicalsoup.Browser() 
    page = browser.get(url) 
    search_form = page.soup.find("form", {"id": "z-form"}) 
    search_form.find("input", {"id":"searchterm"})["value"] = query 
    response = browser.submit(search_form, page.url) 

    print(response) # the response is 200, so it should be a good sign 

    # actual parsing will come later... 
    print("1235" in response.text) # quick-check to see if there is what I'm looking for, but I get False 

    # in fact this... 
    print(page.text == response.text) # ...gives me True 

fetchfile("1235/2012") 

je peux Je ne comprends pas ce qui me manque. Je préfère ne pas utiliser de sélénium. Des indices?

Répondre

0

Je viens de terminer le même problème. Je suis aussi assez nouveau pour Python, alors laissez-moi essayer d'expliquer. Vous «trouvez» les éléments sur la page, mais vous devez prendre le résultat de votre recherche de formulaire et l'afficher dans un objet Form, puis vous pouvez définir les valeurs de l'objet de formulaire et l'envoyer. La raison pour laquelle vous ne récupérez rien après l'avoir envoyée parce qu'aucune de vos valeurs de formulaire n'est définie, vous effectuez simplement la recherche. Je sais que cette question est ancienne, mais j'espère que cela aidera aussi les autres. Je ne sais pas ce que la valeur réelle de "requête" est censée être, donc je ne peux pas vérifier que cela fonctionne, mais dans mon programme c'est la méthode que j'ai utilisée.

import mechanicalsoup 
import html5lib 
from bs4 import BeautifulSoup 

def fetchfile(query): 

    url = "http://www.italgiure.giustizia.it/sncass/" 

    browser = mechanicalsoup.Browser() 
    page = browser.get(url) 

    # Using page.find() with the appropriate attributes is also useful 
    # for forms without names 
    FORM = mechanicalsoup.Form(page.find('form', attrs={'id': 'z-form'})) 

    FORM["searchterm"] = query 

    # You can verify the form values are set by doing this: 
    print("Form values: ", vars(FORM)) 

    response = browser.submit(FORM, url) 

    print(response) # the response is 200, so it should be a good sign 
    Results = browser.get_current_page() 
    print("Results: ", Results) 

    # actual parsing will come later... 
    # quick-check to see if there is what I'm looking for, but I get False 
    # print("1235" in response.text) 

    # in fact this... 
    print(page.text == response.text) # ...gives me True 

# fetchfile("1235/2012") 
+0

Merci pour la réponse, mais à la fin je devais utiliser Sélénium, car après avoir soumis le résultat j'ai besoin de télécharger les fichiers pdf ... et il semble qu'il n'y a pas d'autre moyen que d'utiliser le sélénium et le « clic "ces résultats. Mon nouveau problème est robots.txt, mais il y a peu que je puisse faire si je veux me conformer –