1

次のコードでは、バッカーがある場所のホーム都市と場所をキックスターターから取得しようとしています。しかし、私は次のようなエラーに実行し続ける:私はバッカーとキックスターターの異なるプロジェクトの故郷を手に入れようとします

File "D:/location", line 60, in < module >
page1 = urllib.request.urlopen(projects[counter])
IndexError: list index out of range

誰かがurllib.request.urlopenするページを養うために、よりエレガントな解決策を持っていますか?あなただけのプロジェクトのステータスメッセージを印刷するcounterを使用する場合は

# coding: utf-8 
import urllib.request 
from bs4 import BeautifulSoup 
from selenium import webdriver 
import pandas as pd 
import time 
from datetime import datetime 
from collections import OrderedDict 
import re 

browser = webdriver.Firefox() 
browser.get('https://www.kickstarter.com/discover?ref=nav') 
categories = browser.find_elements_by_class_name('category-container') 

category_links = [] 
for category_link in categories: 
#Each item in the list is a tuple of the category's name and its link.category_links.append((str(category_link.find_element_by_class_name('f3').text), 
        category_link.find_element_by_class_name('bg-white').get_attribute('href'))) 


scraped_data = [] 
now = datetime.now() 
counter = 1 

for category in category_links: 
browser.get(category[1]) 
browser.find_element_by_class_name('sentence-open').click() 
time.sleep(2) 
browser.find_element_by_id('category_filter').click() 
time.sleep(2) 

for i in range(27): 
    try: 
     time.sleep(2) 
     browser.find_element_by_id('category_'+str(i)).click() 
     time.sleep(2)    
    except: 
     pass 

#while True: 
# try: 
#  browser.find_element_by_class_name('load_more').click() 
# except: 
#  break   

projects = [] 
for project_link in browser.find_elements_by_class_name('clamp-3'): 
    projects.append(project_link.find_element_by_tag_name('a').get_attribute('href')) 

for project in projects: 
    **page1 = urllib.request.urlopen(projects[counter])** 
    soup1 = BeautifulSoup(page1, "lxml") 
    **page2 = urllib.request.urlopen(projects[counter].split('?')**[0]+'/community') 
    soup2 = BeautifulSoup(page2, "lxml") 
    time.sleep(2) 
    print(str(counter)+': '+project+'\nStatus: Started.') 
    project_dict = OrderedDict() 
    project_dict['Category'] = category[0] 
    browser.get(project) 
    project_dict['Name'] = soup1.find(class_='type-24 type-28-sm type-38-md navy-700 medium mb3').text 

    project_dict['Home State'] = str(soup1.find(class_='nowrap navy-700 flex items-center medium type-12').text) 

    try: 
     project_dict['Backer State'] = str(soup2.find(class_='location-list-wrapper js-location-list-wrapper').text) 
    except: 
     pass 

    print('Status: Done.') 
    counter+=1 
    scraped_data.append(project_dict) 

later = datetime.now() 
diff = later - now 

print('The scraping took '+str(round(diff.seconds/60.0,2))+' minutes, and scraped '+str(len(scraped_data))+' projects.') 

df = pd.DataFrame(scraped_data) 
df.to_csv('kickstarter-data.csv') 

答えて

2

は、あなたの代わりにrangeまたはenumerateを使用することができます。

コード(** **の行を参照してください)。ここでenumerateとの例は次のとおりです。

for counter, project in enumerate(projects): 
    ... code ... 

enumerateはタプル(インデックス、項目)を生成し、それがあるとして、あなたのコードの残りの部分は正常に動作する必要があります。あなたがアイテムにアクセスするためにcounterを使用するときに、あなたが必要としないforループでは1

counterを開始するので、そうあなたがIndexErrorを得る

リストのインデックスは0から始まります:

Aは、より多くの事をfiew projects[counter]、ちょうど使用project

関連する問題