2

我一直在关注一些 Python 教程,需要一些帮助。在htmlfile = urllib.urlopen(urls[i])下面的代码中,我不明白为什么[i]urls.

import urllib

urls = ["http://google.com","http://nytimes.com","http://cnn.com"]
i=0

while i< len(urls):
    htmlfile = urllib.urlopen(urls[i])
    htmltext = htmlfile.read()
    print htmltext
    i+=1
4

6 回答 6

3

i正在索引列表urls,允许您一一返回项目。见下文:

>>> urls = ["http://google.com","http://nytimes.com","http://cnn.com"]
>>> i = 0
>>> while i < len(urls):
...     print i, urls[i]
...     i += 1
...
0 http://google.com
1 http://nytimes.com
2 http://cnn.com
>>>

另外,我想提一下,您的代码可以重构以提高效率:

import urllib
urls = ["http://google.com","http://nytimes.com","http://cnn.com"]
for url in urls:
    print urllib.urlopen(url).read()

新代码的功能与旧代码完全相同。

于 2013-10-14T19:04:11.827 回答
2

urls是一个字符串列表。[i]引用该列表中的第ith 个元素,因此您一次访问每个站点。

不过,非常值得注意的是,这不是一个好的 Pythonic 遍历列表的方式。你的循环会像这样更好更清晰:

for url in urls:
    htmlfile = urllib.urlopen(url)
    htmltext = htmlfile.read()
    print htmltext

还值得考虑:一旦您更习惯了代码本身,您就可以一次完成该循环中的所有事情,而无需分配所有这些额外的变量。

for url in urls:
    print urllib.urlopen(url).read()
于 2013-10-14T19:03:28.747 回答
1

urls 它是一个列表。[i] 是在该列表的一个项目之间进行选择。

例如,如果:

>>> urls = ["http://google.com","http://nytimes.com","http://cnn.com"]

然后:

>>> urls[0]
"http://google.com"
>>> urls[1]
"http://nytimes.com"

等等。

但是,在你的情况下,我会使用 for 循环而不是一段时间,所以你不需要在之前声明循环变量。像这样:

import urllib

urls = ["http://google.com","http://nytimes.com","http://cnn.com"]


for i in  range(len(urls)):
    htmlfile = urllib.urlopen(urls[i])
    htmltext = htmlfile.read()
    print htmltext
于 2013-10-14T19:03:21.073 回答
1

这真的应该重写。你有一个列表,而不是一个元组,所以集合中项目的位置没有意义。

import urllib

urls = ["http://google.com","http://nytimes.com","http://cnn.com"]

for url in urls:
    htmlfile = urllib.urlopen(url)
    htmltext = htmlfile.read()
    print htmltext

如果您遍历所有项目,在 Python 中使用计数器也不是很惯用。仅当您需要自定义排序时才使用它,然后再有itertools包。

于 2013-10-14T19:04:33.700 回答
1

urls是一个列表,因此有一个索引。为了访问列表中的值,您必须通过其索引来访问。让我演示一下:

>>> urls = ['hello', 'world']
>>> urls[0]
'hello'
>>> urls[1]
'world'
>>> len(urls)
2
>>> 

请注意,索引是0基于的(意味着第一个元素是通过 访问的0,然后1是第二个元素)。这就是为什么您的while语句中的条件读取while i < len(url),因为i正在访问索引,并且由于索引0从而不是开始1,您只能继续它直到1它是列表中的第二个值。

2让我通过放入索引值来演示如果超出范围会发生什么:

>>> urls[2]

Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    urls[2]
IndexError: list index out of range
>>> 

如您所见,您得到一个IndexError.

但是,在您的情况下,有一种更好的方法可以使用循环来遍历listurl for

# This look will go through all the values inside your list, and the current value will be called url
for url in urls:  # Here url is the value inside the list
    htmlfile = urllib.urlopen(url)
    htmltext = htmlfile.read()
    print htmltext

使用for循环的演示:

>>> for url in urls:
    print url


hello
world
>>> 

我是否还建议您使用python-requests, 它非常适合通过常见的 HTTP 协议(​​例如GET和)发送请求POST。以后会省去很多麻烦

于 2013-10-14T19:05:04.953 回答
0

urls 是一个列表,因此url[i]需要对列表中的项目进行索引。如果没有索引,您将尝试打开 url 列表而不是单个 url。

while 循环从 开始并迭代,i=0直到.i < len(urls)urls

于 2013-10-14T19:03:33.400 回答