IndexError:列表索引超出范围(Python)
Posted
技术标签:
【中文标题】IndexError:列表索引超出范围(Python)【英文标题】:IndexError: list index out of range(Python) 【发布时间】:2017-04-05 21:36:53 【问题描述】:请找到我的代码:
# # 解析一个新帖子。 #
def parse_new_post(self,response,review,created_at,data):
data.update(
'cool_count':self.set_int(review.css('a[rel=cool]').css('span[class=count]::text').extract()),
'created_at':self.set_date(review.css('meta[itemprop=datePublished]::attr(content)').extract()[0]),
'elite':len(review.css('.is-elite')) == 1,
'funny_count':self.set_int(review.css('a[rel=funny]').css('span[class=count]::text').extract()),
'owner_comment_text':self.set_text(review.css('span[class=js-content-toggleable\ hidden]::text').extract()).replace("\n"," "),
#'rating':review.css('div[itemprop=reviewRating]').css('div').css('i::attr(title)').re('(\\d\.\\d)'),
'rating':review.css('div[itemprop=reviewRating]').css('meta').css('::attr(content)').re('(\\d\.\\d)')[0].encode('utf-8'),
#'review_id':review.css('div::attr(data-review-id)').extract()[0].encode('utf-8'),
#'review_id':review.xpath('.//div[contains(@class,"review review--with-sidebar")]/@data-review-id').extract(),
'review_text':self.set_text(review.css('p[itemprop=description]::text').extract()).replace("\n"," "),
'total_friends':self.set_int(review.css('li[class=friend-count]').css('b::text').extract()),
#'total_friends':int(review.xpath('.//li[contains(@class,"friend-count")]/span/b/text()').extract()[0].strip()),
#'total_reviews':int(review.xpath('.//li[contains(@class,"review-count")]/span/b/text()').extract()[0].strip()),
#'total_friends':int(review.xpath('.//li[contains(@class,"friend-count")]/b/text()').extract()[0].strip()),
#'total_reviews':int(review.xpath('.//li[contains(@class,"review-count")]/b/text()').extract()[0].strip()),
'total_reviews':self.set_int(review.css('li[class=review-count]').css('b::text').extract()),
'user_id':review.css('div[class*=photo-box]').css('a::attr(href)').extract(),
'useful_count':self.set_int(review.css('a[rel=useful]').css('span[class=count]::text').extract()),
#'user_location':review.css('li[class=user-location]').css('b::text').extract()[0].encode('utf-8'),
'user_location':review.xpath('.//li[@class="user-location responsive-hidden-small"]/b/text()').extract(),
'username':review.css('meta[itemprop=author]::attr(content)').extract()[0].encode('utf-8'),
'review_id':review.xpath('.//div[contains(@class,"review review--with-sidebar")]/@data-review-id').extract()[0].encode('utf-8'),
)
当我抓取网站时,出现以下错误:
2016-11-22 01:27:52 [scrapy] ERROR: Spider error processing <GET https://www.yelp.com/biz/lexus-of-glendale-glendale?utm_campaign=yelp_api&utm_medium=api_v2_phone_search&utm_source=HPtU-ro8MXX3MOY_DQkP6A?sort_by=date_desc> (referer: None)
Traceback (most recent call last):
File "/usr/lib64/python2.7/site-packages/scrapy/utils/defer.py", line 102, in iter_errback
yield next(it)
File "/usr/lib64/python2.7/site-packages/scrapy/spidermiddlewares/offsite.py", line 28, in process_spider_output
for x in result:
File "/usr/lib64/python2.7/site-packages/scrapy/spidermiddlewares/referer.py", line 22, in <genexpr>
return (_set_referer(r) for r in result or ())
File "/usr/lib64/python2.7/site-packages/scrapy/spidermiddlewares/urllength.py", line 37, in <genexpr>
return (r for r in result or () if _filter(r))
File "/usr/lib64/python2.7/site-packages/scrapy/spidermiddlewares/depth.py", line 54, in <genexpr>
return (r for r in result or () if _filter(r))
File "/c360/apps/c360nextgen/src/crawlers/yelp_new/yelp_new/spiders/lexus_posts.py", line 85, in parse
yield self.check_for_new_post(response,review,created_at,data)
File "/c360/apps/c360nextgen/src/crawlers/yelp_new/yelp_new/spiders/lexus_posts.py", line 95, in check_for_new_post
return self.parse_new_post(response,review,created_at,data)
File "/c360/apps/c360nextgen/src/crawlers/yelp_new/yelp_new/spiders/lexus_posts.py", line 123, in parse_new_post
'review_id':review.xpath('.//div[contains(@class,"review review--with-sidebar")]/@data-review-id').extract()[0].encode('utf-8'),
IndexError: list index out of range
【问题讨论】:
嗨!欢迎!我认为您应该提供发生崩溃的应用程序代码,在这种情况下,社区会尽力帮助您review.xpath('.//div[contains(@class,"review review--with-sidebar")]/@data-review-id').extract()
是一个空列表
请将其格式化为代码,以便我们阅读。
当我获取它时,它的返回值..你能帮我写代码吗?
【参考方案1】:
在评论列表中添加检查:
review_list = review.xpath('.//div[contains(@class,"review review--with-sidebar")]/@data-review-id').extract()
if review_list:
'review_id' : review_list[0].encode('utf-8')
else:
'review_id' : ""
【讨论】:
【参考方案2】:indexerror: list out of range,仅仅意味着您试图调用列表中不存在的索引/项目。
这是一个例子:
list = [1, 2]
print(list[4])
请注意,列表中没有 5. 项,因此它将导致: IndexError:列表索引超出范围(Python)
在你的位置,它返回一个空列表,你试图找到[0]的第一个元素(0,是第一项,但列表中没有任何项目)
【讨论】:
你正在获取 4 作为值还是 4 作为索引? 4 作为索引。 list[4] 表示列表中的第 5 个项目,而不是数字 4 如果有帮助,请点赞 :) 谢谢@Seastian..你能帮我吗,我应该在我的代码中改变什么? 你还没有展示你所有的代码,你展示的那部分代码有点乱。在这些情况下很难为您提供帮助 也许你可以给我提供网站,也许我可以检查 xpath 。并检查它是否正确【参考方案3】:您的查询返回一个空列表。因此它找不到第一个元素[0]
并抛出一个IndexError。修复用于抓取网站的代码。
【讨论】:
你能帮我解决我应该解决的问题吗? 我认为review.xpath('.//div[contains(@class,"review review--with-sidebar")]/@data-review-id').extract()
中的某些内容是错误的,但您需要自己检查您的 xpath。
当我使用 (.//div[contains(@class,"review review--with-sidebar")]/@data-review-i) 时,我在列表中获取数据。 以上是关于IndexError:列表索引超出范围(Python)的主要内容,如果未能解决你的问题,请参考以下文章