2017-08-14 4 views
0

Der Versuch, ein Data Miner zu machen, ich habe alle Urls in einem Array, aber wenn ich versuche, auf dem Schaber zu nehmen, gibt mir diese Fehlermeldung:Typeerror: Liste Indizes müssen ganze Zahlen sein, nicht Tag - Python

$TypeError: list indices must be integers, not Tag -- python 

das ist mein voller Code für den Scraper:

s = sched.scheduler(time.time, time.sleep) 
def myScraper(sc): 

csv_f = csv.reader(f) 
quote_page = [] 

for row in csv_f: 
    quote_page.append(url+row[0]) 


i=1 
for var in quote_page: 
    num_dat = [] 
    txt_dat = [] 
    num_dat2 = [] 
    txt_dat2 = [] 

    s.enter(5,1,myScraper, (sc,)) 
    sleep(5) 

    print(quote_page[i]) 

    page = urlopen(quote_page[i]) 

    i = i+1 

    soup = BeautifulSoup(page, 'html.parser') 
    data_store = [] 
    for tr in soup.find_all('tr'): # find table rows 
     tds = tr.find_all('td', attrs={'class': 'fieldData'}) # find all table cells 
     for i in tds: # returns all cells from html rows 
      if i != []: # pops out empty cells from returned data 
       data_store.append(i.text) 
       #print(i.text) 
       #print("\n") 
    data_store2 = [] 
    for tr in soup.find_all('tr'): 
     tds2 = tr.find_all('td', attrs={'class': 'improvementsFieldData'}) 
     for i in tds2: 
      if i != []: 
       data_store2.append(i.text) 

    for j in data_store: 
     if ',' in j and ' ' not in j: 
      lft_dec = j[:j.index(',')].replace('$', '') 
      rght_dec = j[j.index(','):].replace(',', '') # drop the decimal 
      num_dat.append(float(lft_dec+rght_dec)) # convert to numerical data 
     else: 
      txt_dat.append(j) 

    for j in data_store2: 
     if ',' in j and ' ' not in j: 
      lft_dec = j[:j.index(',')].replace('$', '') 
      rght_dec = j[j.index(','):].replace(',', '').replace('Sq. Ft', '') # drop the decimal and Sq 
      num_dat2.append(float(lft_dec+rght_dec)) # convert to numerical data 
     elif ('Sq. Ft' and ',') in j: 
      sqft_dat_befcm = j[:j.index(',')].replace(',', '') 
      sqft_dat_afcm = j[j.index(','):].replace(' ', '').replace('Sq.Ft', '').replace(',', '') 
      num_dat2.append(float(sqft_dat_befcm+sqft_dat_afcm)) 
     else: 
      txt_dat2.append(j) 
    print(num_dat) 
    print(txt_dat) 
    print(num_dat2) 
    print(txt_dat2) 







s.enter(5, 1, myScraper, (s,)) 
s.run() 
f.close 

Grundsätzlich ist mein Ziel für dieses Programm ist eine Reihe von URLs kann ich einen Browser abkratzen die ersten dann wartet für ein Intervall Menge an Zeit und Wiederholung öffne gegeben bis das Array fertig ist.

EDIT *** Leider erstes Mal auf diesem Posting. Hier ist die vollständige stacktrace

Traceback (most recent call last): 
    File "C:\Users\Ahmad\Desktop\HouseProject\AhmadsScraper.py", line 85, in 
<module> 
    s.run() 
    File "C:\Users\Ahmad\Anaconda2\lib\sched.py", line 117, in run 
    action(*argument) 
    File "C:\Users\Ahmad\Desktop\HouseProject\AhmadsScraper.py", line 32, in 
myScraper 
    print(quote_page[i]) 
TypeError: list indices must be integers, not Tag 
+1

Können Sie bitte die vollständige Traceback bieten? So kann man verstehen, welche Zeile den Fehler wirft? –

+0

Ja, definitiv! Danke für die Antwort! – Matherz

Antwort

0

Das Problem ist, weil Sie die gleiche Variable i als Zähler und als eine innere Schleifenvariable verwenden. Wie wäre es mit enumerate stattdessen?

for idx, var in enumerate(quote_page): 
    ... 
    print(quote_page[idx]) 

    page = urlopen(quote_page[idx]) 
+0

Alter, vielen Dank! haha Kann nicht glauben, dass ich verpasst habe, dass es jetzt Sinn macht! Ich habe es gerade repariert und es hat funktioniert !! Danke noch einmal! – Matherz

Verwandte Themen