2012-12-04 15 views
6

Istnieje potrzeba, aby zrobić wyszukiwania na stronieWysyłanie danych z formularza do strony aspx

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

To jest strona aspx (Zaczynam tę wędrówkę od wczoraj, przepraszam za pytanie Noob)

użyciu BeautifulSoup mogę uzyskać __VIEWSTATE i __EVENTVALIDATION takiego:

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

a nagłówek może być ustawione tak:

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'} 

jeśli przejdziesz do strony internetowej, jedynymi wartościami naprawdę chcę przekazać to imię i nazwisko ...

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

więc wprowadzenie go wszystkie razem jej tak:

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 

Problem polega na tym, że naprawdę nie daje mi to rezultatów ... nie wiem, czy muszę podać każdą wartość dla każdego pola tekstowego w formularzu, czy co ... może po prostu nie robię tego poprawnie . tak czy inaczej, tylko mając nadzieję, że ktoś może mnie wyprostować. Myślałem, że to mam, ale spodziewałbym się zobaczyć listę lekarzy i dane kontaktowe.

jakikolwiek wgląd jest bardzo cenny, użyłem wcześniej beautifulsoup, ale myślę, że moim problemem jest właśnie wysłanie Żądania i posiadanie odpowiedniej ilości informacji w części danych.

Dzięki!

+0

Co masz w zamian? – Nasir

+0

hi @nasir, wyjście jest po prostu beautifulsoup parsowanie początkowej zmiennej URL jak poprzednio ... więc nie jest to naprawdę daje mi nic użytecznego poza tym, że nie powoduje błędów podczas robienia adresu urllib2.request (URL, dane, nagłówki). Dzięki, –

+0

Zrobiłem kilka powiązań bez powodzenia. Dziwne dla mnie. Próbowałem symulować całe żądanie, dodając wszystkie nagłówki żądań i dane wejściowe formularza. nadal nie ma blokady, a odpowiedź ma "Connection: close", ale powinna mieć kod 302. Postaram się sprawdzić, czy potrafię to rozwiązać. – Nasir

Odpowiedz

5

wziął porady od @pguardiario i poszedł trasę Mechanize ... znacznie prostsze

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

Jestem daleko od wykończenia, ale to zaczyna mi dużo dalej.

+1

Dzięki Randall. Skopiowałem twój kod, zmieniłem adres URL, a formularze dodałem "formularz wydruku", a ja pracowałem nad projektem skrobania ASPX w mniej niż 2 minuty. Zaoszczędziłem wiele godzin. – croc

Powiązane problemy