web-dev-qa-db-ja.com

PythonリクエストでPDFファイル名を取得するには?

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要求ライブラリ付きのファイルのファイル名を取得する方法を知っている人はいますか?

23
kramer65

HTTPヘッダーcontent-dispositionで指定されます。したがって、名前を抽出するには、次のようにします。

import re
d = r.headers['content-disposition']
fname = re.findall("filename=(.+)", d)

正規表現を介して文字列から抽出された名前(reモジュール)。

46
user3255354

どうやら、この特定のリソースについては次の場所にあります。

r.headers['content-disposition']

ただし、常にそうであるかどうかはわかりません。

7
Maksim Solovjov

他の答えのいくつかに基づいて、ここに私がそれをする方法があります。 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文字列の解析には間違いなくより良い方法がありますが、簡単にするために、これ以上ライブラリを使用したくありませんでした。

2
Nilpo

オプションヘッダーに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'})
0
myildirim