2014-03-26 6 views
-1

Я продолжаю получать индекс индекса вне диапазона при попытке запустить этот код, код анализирует таблицы сайтов, просматривая его страницы и вводит данные в лист excel.IndexError: индекс индекса вне диапазона?

Ошибка отдается на доход = перевалы [0] .String:

from urllib.request import urlopen 
from bs4 import BeautifulSoup 
from openpyxl import Workbook 
from openpyxl.cell import get_column_letter 
import datetime 


now = datetime.datetime.now() 

wb = Workbook() 
dest_filename = r'iOS Top Grossing Data.xlsx' 
ws = wb.active 
ws = wb.create_sheet() 
ws.title = now.strftime("%m-%d-%y") 
sh = wb.get_sheet_by_name('Sheet') 
wb.remove_sheet(sh) 

ws['A1'] = "REVENUE" 
ws.column_dimensions['A'].width = 11 
ws.cell('A1').style.alignment.horizontal = 'center' 
ws.cell('A1').style.font.bold = True 

ws['B1'] = "FREE" 
ws.column_dimensions['B'].width = 7 
ws.cell('B1').style.alignment.horizontal = 'center' 
ws.cell('B1').style.font.bold = True 

ws['C1'] = "PAID" 
ws.column_dimensions['C'].width = 7 
ws.cell('C1').style.alignment.horizontal = 'center' 
ws.cell('C1').style.font.bold = True 

ws['D1'] = "GAME" 
ws.column_dimensions['D'].width = 27 
ws.cell('D1').style.alignment.horizontal = 'center' 
ws.cell('D1').style.font.bold = True 

ws['E1'] = "PRICE" 
ws.column_dimensions['E'].width = 7 
ws.cell('E1').style.alignment.horizontal = 'center' 
ws.cell('E1').style.font.bold = True 

ws['F1'] = "REVENUE" 
ws.column_dimensions['F'].width = 11 
ws.cell('F1').style.alignment.horizontal = 'center' 
ws.cell('F1').style.font.bold = True 

ws['G1'] = "ARPU INDEX" 
ws.column_dimensions['G'].width = 15 
ws.cell('G1').style.alignment.horizontal = 'center' 
ws.cell('G1').style.font.bold = True 

ws['H1'] = "DAILY NEW USERS" 
ws.column_dimensions['H'].width = 17 
ws.cell('H1').style.alignment.horizontal = 'center' 
ws.cell('H1').style.font.bold = True 

ws['I1'] = "DAILY ACTIVE USERS" 
ws.column_dimensions['I'].width = 19 
ws.cell('I1').style.alignment.horizontal = 'center' 
ws.cell('I1').style.font.bold = True 

ws['J1'] = "ARPU" 
ws.column_dimensions['J'].width = 7 
ws.cell('J1').style.alignment.horizontal = 'center' 
ws.cell('J1').style.font.bold = True 

ws['K1'] = "RANK CHANGE" 
ws.column_dimensions['K'].width = 14 
ws.cell('K1').style.alignment.horizontal = 'center' 
ws.cell('K1').style.font.bold = True 

page = 0 

while page < 6: 
     page += 1 
     url = "http://thinkgaming.com/app-sales-data/?page=" + str(page) 
     html = str(urlopen(url).read()) 

     soup = BeautifulSoup(html) 
     table = soup.find("table") 

     counter = 0 

     while counter < 51:  
         rows = table.findAll('tr')[counter] 
         cols = rows.findAll('td') 

         revenue = cols[0].string 
         revenue = revenue.replace('\\n', '') 
         revenue = revenue.replace(' ', '') 

         free = cols[1].string 
         free = free.replace('\\n', '') 
         free = free.replace(' ', '') 

         paid = cols[2].string 
         paid = paid.replace('\\n', '') 
         paid = paid.replace(' ', '') 

         game = cols[3].string 

         price = cols[4].string 
         price = price.replace('\\n', '') 
         price = price.replace(' ', '') 

         revenue2 = cols[5].string 
         revenue2 = revenue2.replace('\\n', '') 
         revenue2 = revenue2.replace(' ', '') 

         dailynewusers = cols[6].string 
         dailynewusers = dailynewusers.replace('\\n', '') 
         dailynewusers = dailynewusers.replace(' ', '') 

         cell_location = counter 
         cell_location += 1 

         ws['A'+str(cell_location)] = revenue 

         counter += 1 

wb.save(filename = dest_filename)    

Вот отслеживающий:

Traceback (most recent call last): 
File "C:\Users\shiver_admin\Desktop\script.py", line 89, in <module> revenue = cols[0].string IndexError: list index out of range 
+0

Просим оставить ваш отзыв. – Manhattan

+0

Traceback (самый последний вызов последнего): Файл "C: \ Users \ shiver_admin \ Desktop \ script.py", строка 89, в доход = перевалы [0] .String IndexError: Индекс списка вне диапазона – Droster

+1

You получают эту ошибку, потому что 'cols' явно пуст. '0' относится к первому индексу, и единственным способом, который может быть вне диапазона, является то, что в списке нет первого элемента (т. Е. Он не имеет элементов). –

ответ

3

То же, что комментарии, вы не получаете никаких <td> тегов просто потому что они не существуют, особенно для индекса [0]. Первый <tr> тег в этой таблице это:

enter image description here

Если вы заметили, он имеет заголовки внутри. В принципе, вы должны начать свой counter в 1 вместо 0.

Еще один способ убедиться, что вы получаете правильные строки, проверяет, есть ли у них классы. Если вы заметили, у правильных строк <tr> есть классы внутри них (odd и even). Вы можете использовать что-то вроде table.find_all("tr", class_=True), чтобы получить их.

Пример кода (примечание: закодированы в Python 2.7, но достаточно легко изменить в соответствии с Python 3.x):

import requests as rq 
from bs4 import BeautifulSoup as bsoup 

url = "http://thinkgaming.com/app-sales-data/?page=1" 
r = rq.get(url) 
soup = bsoup(r.content) 

table = soup.find("table", class_="table") 

rows = table.find_all("tr", class_=True) 
cols = [td.get_text().strip().encode("utf-8") for td in rows[0].find_all("td")] 

print cols 

Результат:

['1', '10', '-', 'Clash of Clans', 'Free', 'n/a', '44,259'] 
[Finished in 2.8s] 

Дайте нам знать, если это помогает.

Смежные вопросы