Как получить имя файла pdf с запросами Python?
Я использую Python запросы lib, чтобы получить PDF файл из Интернета. Это отлично работает, но теперь я также хочу оригинальное имя файла. Если я перейду в PDF файл в Firefox и нажмите 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 файла с библиотекой запросов?
Ответы
Ответ 1
Он указан в заголовке http content-disposition
. Итак, чтобы извлечь имя, которое вы бы сделали:
import re
d = r.headers['content-disposition']
fname = re.findall("filename=(.+)", d)
Имя, извлеченное из строки через регулярное выражение (re
module).
Ответ 2
По-видимому, для этого конкретного ресурса он находится в:
r.headers['content-disposition']
Не знаю, всегда ли это так.
Ответ 3
Опираясь на некоторые другие ответы, вот как я это делаю. Если заголовка 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, но для простоты я не хотел привлекать больше библиотек.
Ответ 4
Вы можете использовать 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'})