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

时间:2013-10-26 10:13:06

标签: python loops indexing range

我有一个来自youtube视频的copypasta&python代码,它基本上允许我从RSS提要中提取标题和链接。

import urllib.request
import re

webpage= urllib.request.urlopen("http://feeds.feedburner.com/JohnnyWebber?format=xml").read()

heading = re.compile(b'<title>(.*)</title>')
link    = re.compile(b'<link>(.*)</link>')

findheading= re.findall(heading,webpage)
findlink = re.findall (link,webpage)

lists=[]
lists[:]=range(2,16)

for i in lists:
    print (findheading[i])
    print (findlink[i])
    print ("\n")

我在

中收到错误
 print (findheading[i])

编辑:

另一个问题,在按照unutbu的回答后,我已经能够得到输出但是就像

b'HEADING'
b'TITLE'

但是如果我从正则表达式中删除b,那么我使用字符串而不是像对象这样的字节会出错

1 个答案:

答案 0 :(得分:3)

lists[:]=range(2,16)创建一个从2到15的数字列表:

In [11]: range(2, 16)
Out[11]: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

错误意味着findheadings中的元素少于16个。


因此,不依赖于findheadings中有一定数量元素的任意假设,在Python中使用

更为惯用
for heading in findheadings

迭代findheadings的元素。 heading会 每次通过循环时,都会被分配到findheadings中的值。


要循环findheadingfindlink,请使用zip

for heading, link in zip(findheading, findlink):
    print(heading)
    print(link) 

请注意,如果findheadingfindlink中的元素数量不同,那么当{2}中较短的元素中没有其他元素时,zip将会停止。如果要迭代直到两者都用尽,请使用itertools.zip_longest