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)的主要内容,如果未能解决你的问题,请参考以下文章

Python:IndexError:列表索引超出范围

csv,IndexError:列表索引超出范围

IndexError:列表索引超出范围(对象检测)

IndexError:列表索引超出范围。无法理解问题出在哪里?

IndexError:列表索引超出范围(Python)

使用 TensorFlow 的“IndexError:列表索引超出范围”错误