2012-12-04 12 views
6

V'è la necessità di fare una ricerca sul sito webL'invio di dati del modulo alla pagina aspx

url = r'http://www.cpso.on.ca/docsearch/' 

questa è una pagina aspx (sto cominciando questo trekking come di ieri, mi dispiace per le domande del noob)

utilizzando BeautifulSoup, posso ottenere il __VIEWSTATE e __EVENTVALIDATION come questo:

viewstate = soup.find('input', {'id' : '__VIEWSTATE'})['value'] 
    eventval = soup.find('input', {'id' : '__EVENTVALIDATION'})['value'] 

e l'intestazione può essere impostato in questo modo:

headers = {'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13', 
'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml; q=0.9,*/*; q=0.8', 
'Content-Type': 'application/x-www-form-urlencoded'} 

se si va alla pagina web, gli unici valori voglio davvero passare sono il nome e il cognome ...

LN = "smith" 
    FN = "a" 
    data = {"__VIEWSTATE":viewstate,"__EVENTVALIDATION":ev, 
    "ctl00$ContentPlaceHolder1$MainContentControl1$ctl00$txtLastName":LN, 
    "ctl00$ContentPlaceHolder1$MainContentControl1$ctl00$txtFirstName":FN} 

in modo da mettere insieme tutto il suo in questo modo:

import urllib 
    import urllib2 
    import urlparse 
    import BeautifulSoup 

    url = r'http://www.cpso.on.ca/docsearch/' 
    html = urllib2.urlopen(url).read() 
    soup = BeautifulSoup.BeautifulSoup(html) 

    viewstate = soup.find('input', {'id' : '__VIEWSTATE'})['value'] 
    ev = soup.find('input', {'id' : '__EVENTVALIDATION'})['value'] 
    headers = {'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13', 
     'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml; q=0.9,*/*; q=0.8', 
     'Content-Type': 'application/x-www-form-urlencoded'} 

    LN = "smith" 
    FN = "a" 
    data = {"__VIEWSTATE":viewstate,"__EVENTVALIDATION":ev, 
      "ctl00$ContentPlaceHolder1$MainContentControl1$ctl00$txtLastName":LN, 
      "ctl00$ContentPlaceHolder1$MainContentControl1$ctl00$txtFirstName":FN} 

    data = urllib.urlencode(data) 
    request = urllib2.Request(url,data,headers) 
    response = urllib2.urlopen(request) 
    newsoup = BeautifulSoup.BeautifulSoup(response) 
    for i in newsoup: 
     print i 

Il problema è che non sembra davvero darmi i risultati ... non so se ho bisogno di fornire ogni valore per ogni casella di testo nel modulo o cosa ... forse non lo sto facendo correttamente . comunque, speravo solo che qualcuno potesse mettermi dritto. Pensavo di averlo, ma mi aspetterei di vedere un elenco di medici e informazioni di contatto.

qualsiasi intuizione è molto apprezzata, ho usato beautifulsoup prima, ma penso che il mio problema è solo l'invio di richiesta e la giusta quantità di informazioni nella parte dati.

Grazie!

+0

Cosa ti restituisce? – Nasir

+0

hi @nasir, l'output è solo il beautifulsoup che analizza la variabile URL iniziale come prima ... quindi non mi dà veramente nulla di utile se non quello di non fare errori quando si esegue il pezzo urllib2.request (url, data, header) .. Grazie, –

+0

Ho stretto qualche legame senza successo. Strano per me. Ho provato a simulare l'intera richiesta aggiungendo tutte le intestazioni delle richieste e gli input dei moduli. ancora nessun blocco e la risposta ha 'Connessione: chiusa 'ma dovrebbe avere un codice 302. Proverò a vedere se riesco a risolverlo. – Nasir

risposta

5

preso consigliare dai @pguardiario e se ne andò il percorso mechanize ... molto più semplice

import mechanize 

    url = r'http://www.cpso.on.ca/docsearch/' 
    request = mechanize.Request(url) 
    response = mechanize.urlopen(request) 
    forms = mechanize.ParseResponse(response, backwards_compat=False) 
    response.close() 

    form = forms[0] 

    form['ctl00$ContentPlaceHolder1$MainContentControl1$ctl00$txtLastName']='Smith' 
    form['ctl00$ContentPlaceHolder1$MainContentControl1$ctl00$txtPostalCode']='K1H' 

    print mechanize.urlopen(form.click()).read() 

io sono molto lontano da finire, ma questo mi è sempre un sacco di più.

+1

Grazie Randall. Ho copiato il tuo codice, cambiato l'url e modulo vars aggiunto un "modulo di stampa" e sono stato attivo e in esecuzione su un progetto di scraping ASPX in meno di 2 minuti. Mi ha risparmiato ore di chiacchierare. – croc

Problemi correlati