首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我试着在kickstarter上得到不同项目的支持者和家乡。

我试着在kickstarter上得到不同项目的支持者和家乡。
EN

Stack Overflow用户
提问于 2017-07-26 15:08:53
回答 1查看 122关注 0票数 1

使用下面的代码,我试着从kickstarter获得支持者所在的城市和地方。但是,我始终遇到以下错误:

文件"D:/location",第60行,在< module >中 page1 =urllib.request.urlopen(项目计数器) IndexError:列出超出范围的索引

有人有一个更优雅的解决方案来将页面提供给urllib.request.urlopen吗?(见*中的一行)

代码:

代码语言:javascript
复制
# 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')
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-26 15:33:16

如果只使用counter打印项目状态消息,则可以使用rangeenumerate。下面是enumerate的一个示例:

代码语言:javascript
复制
for counter, project in enumerate(projects): 
    ... code ...

enumerate生成一个元组(索引,项),因此您的其余代码应该可以正常工作。

更多的东西:

列表索引从0开始,所以当您使用counter访问项时,您将得到一个IndexError,因为您使用1启动counter

在for循环中,您不需要projects[counter],只需使用project

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45330914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档