我有一个python脚本,它可以获取网页并对其进行镜像。它适用于一个特定的页面,但我无法让它适用于多个页面。我以为我可以把多个URL放在一个列表中,然后把它提供给函数,但我得到了这个错误:
Traceback (most recent call last):
File "autowget.py", line 46, in <module>
getUrl()
File "autowget.py", line 43, in getUrl
response = urllib.request.urlopen(url)
File "/usr/lib/python3.2/urllib/request.py", line 139, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib/python3.2/urllib/request.py", line 361, in open
req.timeout = timeout
AttributeError: 'tuple' object has no attribute 'timeout'
以下是违规代码:
url = ['https://www.example.org/', 'https://www.foo.com/', 'http://bar.com']
def getUrl(*url):
response = urllib.request.urlopen(url)
with urllib.request.urlopen(url) as response, open(file_name, 'wb') as out_file:
shutil.copyfileobj(response, out_file)
getUrl()
我已经用尽了谷歌试图找到如何用urlopen()打开列表。我找到了一种可行的方法。它获取一个.txt
文档,并逐行遍历,将每一行作为URL提供,但我是使用Python3编写的,无论出于什么原因,twillcommandloop
都不会导入。此外,这种方法很笨拙,需要(据说)不必要的工作。
不管怎样,任何帮助都将不胜感激。
在您的代码中有一些错误:
- 您使用变量参数列表(错误中的元组)定义getUrl
- 将getUrls参数作为单个变量进行管理(改为列表)
你可以试试这个代码
import urllib2
import shutil
urls = ['https://www.example.org/', 'https://www.foo.com/', 'http://bar.com']
def getUrl(urls):
for url in urls:
#Only a file_name based on url string
file_name = url.replace('https://', '').replace('.', '_').replace('/','_')
response = urllib2.urlopen(url)
with open(file_name, 'wb') as out_file:
shutil.copyfileobj(response, out_file)
getUrl(urls)
它不支持元组:
urllib.request.urlopen(url[, data][, timeout])
Open the URL url, which can be either a string or a Request object.
你的电话不正确。应该是:
getUrl(url[0],url[1],url[2])
在函数内部,使用类似于"for u in url"的循环来遍历所有url。
您应该使用for
循环来迭代URL:
import shutil
import urllib.request
urls = ['https://www.example.org/', 'https://www.foo.com/']
file_name = 'foo.txt'
def fetch_urls(urls):
for i, url in enumerate(urls):
file_name = "page-%s.html" % i
response = urllib.request.urlopen(url)
with open(file_name, 'wb') as out_file:
shutil.copyfileobj(response, out_file)
fetch_urls(urls)
我想您希望将内容保存到单独的文件中,所以我在这里使用了enumerate
来创建一个uniqe文件名,但很明显,您可以使用hash()
、uuid
模块到创建slug的任何东西。