【问题标题】:"IndexError: list index out of range" when reaching end of list到达列表末尾时出现“IndexError:列表索引超出范围”
【发布时间】:2016-12-15 18:13:29
【问题描述】:

我从网页上的表格中提取了一些数据,并将其放入列表中。但是,当我到达列表末尾时,我收到“IndexError:列表索引超出范围”错误,我不知道如何修复它。

from bs4 import BeautifulSoup
import urllib2

soup = BeautifulSoup(urllib2.urlopen("https://www.countyofdane.com/election/electiondetail.aspx?id=54").read())
table = soup.find("table", {"id":"gdvPrecinctDetail101"})

a = table.findAll("td")
slipstr = list(a)
data_list = []

for t in slipstr:
    t = str(t)
    new_t = t[4:-5]
    data_list.append(new_t)

x = 0
y = 9
for yes in data_list:
    if yes < len(data_list):
        break
    else:
        print data_list[x] + ": ",
        for data_point in data_list[x+1:y]:
            print data_point,
        print "\n"
        x += 9
        y += 9

错误信息:

print data_list[x] + ": ",
IndexError: list index out of range

谢谢!

编辑:每行(戴恩县的城市)中有 9 列(候选)数据,这就是为什么 x 和 y 每次循环都增加 9。

【问题讨论】:

    标签: python web-scraping beautifulsoup


    【解决方案1】:

    我认为你需要将循环的中断条件改为:

    if x > len(data_list)-1:
        break
    

    【讨论】:

    • 我仍然收到相同的错误消息,有趣的是我尝试将“len(data_list)”之后的最后一部分更改为“-10”和“-100”,它仍然产生相同的错误消息.我想我之前在代码中做错了什么,但仍然不确定。
    • 我用这个调整运行了代码,它不再给出索引错误了。它打印以下行:“T ALBION WDS 1-2: 369 732 1 11 0 0 0 3”到“C VERONA WDS 6-9: 1248 2178 4 33 0 0 10 2”。你把yes改成x了吗?
    • 如果您的问题已被此答案解决,您可以将其设置为已回答。
    【解决方案2】:

    虽然关于索引错误的问题已经回答了,但如果你一开始没有展平表结构,这个问题甚至不会出现。

    通过将元素转换为 HTML 源代码片段来“提取”单元格的文本值,然后在开头和结尾剪切是一个丑陋的 hack,它有一些问题,比如在 „ 中打印“&” C VERONA WDS 1 & 5“ 为“&”。

    使用表格结构并通过text属性获取文本内容,代码可能如下所示:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    from __future__ import absolute_import, division, print_function
    import urllib2
    from bs4 import BeautifulSoup
    
    
    def main():
        url = 'https://www.countyofdane.com/election/electiondetail.aspx?id=54'
        soup = BeautifulSoup(urllib2.urlopen(url).read(), 'lxml')
        rows = soup.find('table', id='gdvPrecinctDetail101').find('tbody')('tr')
        for row in rows:
            row_data = [td.text for td in row('td')]
            print(u'{0}: {1}'.format(row_data[0], ' '.join(row_data[1:])))
    
    
    if __name__ == '__main__':
        main()
    

    【讨论】:

      猜你喜欢
      • 2011-10-31
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      相关资源
      最近更新 更多