我正在研究用Python编写的网络爬虫,我偶然发现了一个非常简单的爬虫。但是,我不理解下面代码中突出显示的最后几行:
import sys
import re
import urllib2
import urlparse
tocrawl = [sys.argv[1]]
crawled = []
keywordregex = re.compile('<meta\sname=["\']keywords["\']\scontent=["\'](.*?)["\']\s/>')
linkregex = re.compile('<a\s(?:.*?\s)*?href=[\'"](.*?)[\'"].*?>')
while 1:
crawling = tocrawl.pop(0)
response = urllib2.urlopen(crawling)
msg = response.read()
keywordlist = keywordregex.findall(msg)
crawled.append(crawling)
links = linkregex.findall(msg)
url = urlparse.urlparse(crawling)
a = (links.pop(0) for _ in range(len(links))) //What does this do?
for link in a:
if link.startswith('/'):
link = 'http://' + url[1] + link
elif link.startswith('#'):
link = 'http://' + url[1] + url[2] + link
elif not link.startswith('http'):
link = 'http://' + url[1] + '/' + link
if link not in crawled:
tocrawl.append(link)这行看起来像是某种列表理解,但我不确定,我需要一个解释。
发布于 2012-08-02 19:16:59
它是一个generator expression,当您迭代列表links时,它只是清空它。
他们本可以换掉这个零件的
a = (links.pop(0) for _ in range(len(links))) //What does this do?
for link in a:有了这个:
while links:
link = links.pop(0)它的工作原理是一样的。但由于从列表末尾弹出更有效,这将比任何一个都要好:
links.reverse()
while links:
link = links.pop()当然,如果您不介意以相反的顺序跟踪链接(我不明白为什么需要按顺序处理它们),那么不反转links列表并直接弹出末尾会更有效。
发布于 2012-08-02 19:28:47
它创建了一个生成器,将对象从链接列表中删除。
解释如下:
range(len(links))返回一个从0到(但不包括)链接列表长度的数字列表。因此,如果链接包含[ "www.yahoo.com", "www.google.com", "www.python.org" ],那么它将生成一个列表0,1,2。
for _ in blah,只是循环遍历列表,丢弃结果。
links.pop(0)从链接中删除第一个项目。
整个表达式返回一个生成器,它从链接列表的头部弹出项目。
最后,在python控制台中进行演示:
>>> links = [ "www.yahoo.com", "www.google.com", "www.python.org "]
>>> a = (links.pop(0) for _ in range(len(links)))
>>> a.next()
'www.yahoo.com'
>>> links
['www.google.com', 'www.python.org ']
>>> a.next()
'www.google.com'
>>> links
['www.python.org ']
>>> a.next()
'www.python.org '
>>> links
[]发布于 2012-08-02 19:16:35
a = (links.pop(0) for _ in range(len(links)))也可以写成:
a = []
for _ in range(len(links)):
a.append(links.pop(0))编辑:
唯一的区别是当使用生成器时,它是懒惰的,所以项目只从链接中弹出,因为它们是通过a请求的,而不是一次全部弹出,当处理大量数据时,它的效率要高得多,如果不使用高级pythonic函数,就没有办法做到这一点。
https://stackoverflow.com/questions/11776241
复制相似问题