2011-08-03 89 views
2

我是Python的新手,我目前的任务是编写一个网页爬虫,在某些网页中查找PDF文件并下载它们。这是我目前的做法(只为1个采样网址):使用mechanize和urllib下载pdf文件

import mechanize 
import urllib 
import sys 

mech = mechanize.Browser() 
mech.set_handle_robots(False) 

url = "http://www.xyz.com" 

try: 
    mech.open(url, timeout = 30.0) 
except HTTPError, e: 
    sys.exit("%d: %s" % (e.code, e.msg)) 

links = mech.links() 

for l in links: 
    #Some are relative links 
    path = str(l.base_url[:-1])+str(l.url) 
    if path.find(".pdf") > 0: 
     urllib.urlretrieve(path) 

程序运行没有任何错误,但我没有看到任何地方被保存的PDF文件。我可以访问pdf并通过浏览器保存。任何想法发生了什么?我使用pydev(基于eclipse)作为我的开发环境,如果这有什么区别的话。

另一个问题是,如果我想在保存PDF时给出一个特定的名称,我该怎么做?这种方法是否正确?在保存PDF之前,我是否必须创建一个带有“文件名”的文件?

urllib.urlretrieve(path, filename) 

在此先感谢。

回答

3

urllib文档说此有关urlretrieve功能:

第二个参数,如果存在的话,则指定文件位置复制 到(如果不存在,则位置将是与所生成的名称的临时文件)。

函数的返回值有文件的位置:

返回一个元组(文件名,标题)其中filename是本地文件 名下该对象可以发现,和头是无论返回的urlopen()返回的对象的info()方法是否为 远程对象(可能缓存)都为 。

因此,改变这一行:

urllib.urlretrieve(path) 

这样:

(filename, headers) = urllib.urlretrieve(path) 

和路径filename将有位置。或者,将filename参数传递给urlretrieve以自己指定位置。

+0

啊,我明白了。谢谢。 – user721975

1

我从来没有使用机械化,而是来自urllib的文档在http://docs.python.org/library/urllib.html

urllib.urlretrieve(网址[,文件名[,reporthook [数据]]])

复制如果需要 ,网络对象用本地文件的URL表示。如果URL指向本地文件,或者该对象的有效缓存副本 存在,则不会复制该对象。返回一个元组 (文件名,头文件)其中filename是本地文件名,在该文件名下可以找到该对象,并且头文件是返回的urlopen()返回的对象的info()方法 (对于远程对象,可能缓存的 )。例外情况与urlopen()相同。

正如你所看到的,如果你没有指定urlretrieve函数,它会保存到临时文件中。因此,请尝试按照第二段代码中的建议指定文件名。否则,你可以调用urlretrieve这样的:

saved_filename,headers = urllib.urlretrieve(path) 

再后来就用saved_filename。

+0

+1。感谢您指出。 – user721975