Python requests lib を使用して、WebからPDFファイルを取得します。これは正常に機能しますが、 FirefoxでPDFファイルに移動してdownload
をクリックすると、pdfを保存するファイル名が既に定義されています。このファイル名を取得するにはどうすればよいですか?
例えば:
import requests
r = requests.get('http://www.researchgate.net/profile/M_Gotic/publication/260197848_Mater_Sci_Eng_B47_%281997%29_33/links/0c9605301e48beda0f000000.pdf')
print r.headers['content-type'] # prints 'application/pdf'
r.headers
おもしろいことは何でもありますが、ファイル名はありません。私は実際にr.filename
..
ダウンロードしたPDF要求ライブラリ付きのファイルのファイル名を取得する方法を知っている人はいますか?
HTTPヘッダーcontent-disposition
で指定されます。したがって、名前を抽出するには、次のようにします。
import re
d = r.headers['content-disposition']
fname = re.findall("filename=(.+)", d)
正規表現を介して文字列から抽出された名前(re
モジュール)。
どうやら、この特定のリソースについては次の場所にあります。
r.headers['content-disposition']
ただし、常にそうであるかどうかはわかりません。
他の答えのいくつかに基づいて、ここに私がそれをする方法があります。 Content-Disposition
ヘッダーがない場合は、ダウンロードURLから解析します。
import re
import requests
from request.exceptions import RequestException
url = 'http://www.example.com/downloads/sample.pdf'
try:
with requests.get(url) as r:
fname = ''
if "Content-Disposition" in r.headers.keys():
fname = re.findall("filename=(.+)", r.headers["Content-Disposition"])[0]
else:
fname = url.split("/")[-1]
print(fname)
except RequestException as e:
print(e)
URL文字列の解析には間違いなくより良い方法がありますが、簡単にするために、これ以上ライブラリを使用したくありませんでした。
オプションヘッダーにwerkzeug
を使用できます https://werkzeug.palletsprojects.com/en/0.15.x/http/#werkzeug.http.parse_options_header
>>> import werkzeug
>>> werkzeug.parse_options_header('text/html; charset=utf8')
('text/html', {'charset': 'utf8'})