2016-08-02 11 views
1

Ich muss nach dem Absenden eines Suchformulars etwas auf einer Webseite scrappen. Das Problem ist, dass wenn ich das über den Browser mache, die Seite nicht neu geladen wird und ich nirgends umgeleitet werde: Das Ergebnis wird unterhalb des Suchformulars angezeigt, ohne den Link zu ändern, obwohl ich sie auf der "neuen" Seite sehen kann html. Aber wenn ich folgenden Code verwenden kann ich nicht die „neue“ Seite html sehen, die in der Antwort sein sollte (der Link zur Verfügung gestellt ist derjenige ich versuche tatsächlich, mit zu arbeiten):Python3: Wenn ich ein Formular über MechanicalSoup abschicke, passiert nichts.

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") 

ich kann verstehe nicht, was ich vermisse. Ich würde lieber kein Selen verwenden. Irgendwelche Hinweise?

Antwort

0

Ich habe gerade mit dem gleichen Problem gekämpft. Ich bin auch ziemlich neu bei Python, also lass mich versuchen zu erklären.

Sie "finden" die Elemente auf der Seite, aber Sie müssen das Ergebnis aus Ihrer Formularsuche nehmen und es in ein Form-Objekt umwandeln, dann können Sie die Werte des Formularobjekts festlegen und übergeben. Der Grund, warum du nichts zurückbekommst, nachdem du es eingereicht hast, weil keiner deiner Formularwerte tatsächlich gesetzt wird, du machst nur die Suche. Ich weiß, dass diese Frage alt ist, aber hoffentlich hilft das auch anderen. Ich weiß nicht, was der tatsächliche Wert von "Abfrage" sein soll, also kann ich nicht überprüfen, ob es funktioniert, aber in meinem Programm ist dies die Methode, die ich verwendet habe.

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

Danke für die Antwort, aber am Ende hatte ich Selen zu verwenden, da nach dem Ergebnis der Einreichung ich die pdf-Dateien herunterladen muß ... und es scheint, dass es keine andere Möglichkeit gibt Selen und „Klicken als die Verwendung von "Diese Ergebnisse. Mein neues Problem ist robots.txt, aber es gibt wenig, was ich tun kann, wenn ich es einhalten will –