【问题标题】:How to test if a link target is a pdf file if the link does not contain .pdf如果链接不包含.pdf,如何测试链接目标是否为pdf文件
【发布时间】:2016-05-20 01:11:12
【问题描述】:

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

有没有办法以编程方式判断链接的目标是否为 pdf,这比仅检查它是否以 .pdf 结尾更智能?

无论内容如何,​​我都不能只下载文件,因为我对 html 文件有不同的处理,我想在其中跟踪辅助链接,看看是否可以找到 pdf,如果目标是直接pdf。

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

【问题讨论】:

  • 请查看URL,这将有助于提升您的内容质量
  • stackoverflow.com/questions/10937350/… 可以帮助您解决问题
  • @willie 我不明白你认为我在这里做错了什么?如果需要,很高兴编辑我的问题,但我不清楚发布指南中遗漏了什么。

标签: python selenium selenium-chromedriver


【解决方案1】:

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

>>> r = requests.head('https://resus.org.au/?wpfb_dl=17')
>>> pprint.pprint(dict(r.headers))
{'Accept-Ranges': 'bytes',
  'Age': '8518',
  'Cache-Control': 'no-cache, must-revalidate, max-age=0',
  'Connection': 'keep-alive',
  'Content-Description': 'File Transfer',
  'Content-Disposition': 'attachment; '
  'filename="anzcor-guideline-6-compressions-apr-2021.pdf"',
    'Content-Length': '535677',
  'Content-Md5': '90AUQUZu0vFGJ7cBPvRxcg==',
  'Content-Security-Policy': 'upgrade-insecure-requests',
  'Content-Type': 'application/pdf',
  'Date': 'Wed, 19 Jan 2022 11:20:06 GMT',
  'Expires': 'Wed, 11 Jan 1984 05:00:00 GMT',
  'Last-Modified': 'Wed, 19 Jan 2022 08:58:08 GMT',
  'Pragma': 'no-cache',
  'Server': 'openresty',
  'Strict-Transport-Security': 'max-age=300, max-age=31536000; '
  'includeSubDomains',
    'Vary': 'User-Agent',
  'X-Backend': 'local',
  'X-Cache': 'cached',
  'X-Cache-Hit': 'HIT',
  'X-Cacheable': 'YES:Forced',
  'X-Content-Type-Options': 'nosniff',
  'X-Xss-Protection': '1; mode=block'}

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

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

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


此时(2022 年 1 月 19 日),您问题中的第一个链接将我重定向到 404 页面。第二个仍然可以访问,但需要使用HTTPS协议,将链接的开始部分从http://更改为https://

但无论如何,如果 URL 没有将您重定向到任何其他页面,则此答案不会过时。如果 URL 是,请通过检查 status_code 来请求最新的 URL,如果它是 301:

>>> r = requests.head('http://resus.org.au/?wpfb_dl=17')
>>> r.status_code
301
>>> r = requests.head('https://resus.org.au/?wpfb_dl=17')
>>> r.status_code
200
>>>

【讨论】:

  • 好吧,我刚刚复制了您上面列出的代码,它给了我 'Content-Type': 'text/html;'对于不是“应用程序/pdf”的两个链接。有什么想法改变或改变什么?我将不胜感激。
  • @KirylAleksandrovich 我又试了一次,是的,你是对的。多年后,链接返回 header'X-Cacheable': 'NO:HTTPS Redirect' 中描述的内容。这意味着链接应该以https:// 开头,而不是HTTP。我已经编辑了我的代码,请使用上面的新代码重试。
  • 是的,新版本运行良好,谢谢!
猜你喜欢
  • 2017-11-10
  • 1970-01-01
  • 2015-02-26
  • 1970-01-01
  • 2011-03-13
  • 2019-04-05
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多