如果链接不包含.pdf,如何测试链接目标是否为pdf文件

时间:2016-05-20 01:11:12

标签: python selenium selenium-chromedriver

我正在使用selenium来抓取一堆以格式和样式混合提供的文件 - 试图同时处理html和pdf,当链接的目标是pdf时我遇到了一个问题文件,但链接本身不包含'.pdf'e.g.and(请注意,一个会自动下载,一个只显示文件 - 至少在Chrome中 - 所以可能需要测试两种不同类型的pdf目标?)

有没有办法以编程方式告诉链接的目标是否为pdf,而不仅仅是检查它是否以.pdf结尾?

我不能只是下载文件而不管内容,因为我对html文件有明确的处理,我想跟随二级链接,看看我是否能找到pdf,如果目标是直接pdf。

ETA:接受的答案非常有效 - 链接的潜在欺骗是用于在文件系统上进行测试,而不是用于下载,因此我认为这不是有效的,当然下面的答案对于这种情况更好。

1 个答案:

答案 0 :(得分:2)

Selenium(或Chrome)检查'Content-Type'标题并选择要执行的操作。您还可以自己使用'Content-Type'检查网址的requests,如下所示:

>>> r = requests.head('http://resus.org.au/?wpfb_dl=17')
>>> pprint(dict(r.headers))
{'Accept-Ranges': 'bytes',
 'Age': '7983',
 'Cache-Control': 'no-cache, must-revalidate, max-age=0',
 'Content-Description': 'File Transfer',
 'Content-Disposition': 'attachment; '
                        'filename="anzcor-guideline-6-compressions-jan16.pdf"',
 'Content-Length': '547978',
 'Content-MD5': 'ULcX0oCGbhW/f8NkQ+6llg==',
 'Content-Type': 'application/pdf',
 'Date': 'Fri, 20 May 2016 01:28:53 GMT',
 'Expires': 'Wed, 11 Jan 1984 05:00:00 GMT',
 'Last-Modified': 'Thu, 19 May 2016 23:15:50 GMT',
 'Pragma': 'no-cache',
 'Vary': 'User-Agent',
 'X-Backend': 'all_requests',
 'X-Cache': 'cached',
 'X-Cache-Hit': 'HIT',
 'X-Cacheable': 'YES:Forced',
 'X-Port': 'port_10081'}


>>> r = requests.head('http://www.mndaust.asn.au/Documents/Information-resources/MND-Aspects-of-care-for-the-primary-health-care-te.aspx')
>>> pprint(dict(r.headers))
{'Accept-Ranges': 'bytes',
 'Cache-Control': 'public, must-revalidate',
 'Content-Disposition': 'inline; '
                        'filename="MND-Aspects-of-care-for-the-primary-health-care-team-2014-FINAL.pdf"',
 'Content-Length': '691752',
 'Content-Type': 'application/pdf',
 'Date': 'Fri, 20 May 2016 01:30:49 GMT',
 'ETag': '"en-au|a1b5237a-d4d7-4f5e-a936-a112637291da|8/4/2014 12:18:16 '
         'AM|LiveSite"',
 'Expires': 'Fri, 20 May 2016 02:00:50 GMT',
 'Last-Modified': 'Mon, 04 Aug 2014 00:18:16 GMT',
 'Server': 'Microsoft-IIS/7.5',
 'X-AspNet-Version': '4.0.30319',
 'X-Powered-By': 'ASP.NET'}

如您所见,您的两个链接中的'Content-Type'都是'application/pdf'

>>> r.headers['Content-Type']
'application/pdf'

所以你可以检查requests.head(link).headers['Content-Type']的输出,并做你需要的任何事情。