python httplib/urllib получить имя файла

есть ли возможность получить имя файла

e.g. xyz.com/blafoo/showall.html

если вы работаете с urllib или httplib?

так что я могу сохранить файл под именем файла на сервере?

если вы заходите на такие сайты, как

xyz.com/blafoo/ 

вы не можете видеть имя файла.

Спасибо


person HappyHacking    schedule 02.08.2012    source источник
comment
возможный дубликат имя файла urllib2   -  person KevinDTimm    schedule 02.08.2012


Ответы (4)


Чтобы получить имя файла из HTTP-заголовков ответа:

import cgi

response = urllib2.urlopen(URL)
_, params = cgi.parse_header(response.headers.get('Content-Disposition', ''))
filename = params['filename']

Чтобы получить имя файла из URL:

import posixpath
import urlparse 

path = urlparse.urlsplit(URL).path
filename = posixpath.basename(path)
person jfs    schedule 02.08.2012
comment
Отличный ответ, одно крошечное исправление. Использование os.path.basename(path) является кросс-платформенным способом сделать это. - person Jorge Vargas; 26.08.2013
comment
@JorgeVargas: нет. posixpath здесь правильный модуль. Кроме того, было бы ошибкой использовать здесь os.path. Если вы не можете понять, почему, спросите, я уточню. - person jfs; 26.08.2013
comment
Я спрошу: зачем использовать posixpath? - person Karl M. Davis; 17.09.2014
comment
@KarlM.Davis: URL-адреса используют '/' в своем сегменте пути. os.path в Windows может использовать '\\', который не подходит для URL-адресов, в качестве разделителя пути. posixpath использует '/'. - person jfs; 17.09.2014

Используйте 1_:

import urllib

req = urllib.request.Request(url, method='HEAD')
r = urllib.request.urlopen(req)
print(r.info().get_filename())

Пример :

In[1]: urllib.request.urlopen(urllib.request.Request('https://httpbin.org/response-headers?content-disposition=%20attachment%3Bfilename%3D%22example.csv%22', method='HEAD')).info().get_filename()
Out[1]: 'example.csv'
person the21st    schedule 18.04.2019

Не имеет большого смысла то, что вы спрашиваете. Единственное, что у вас есть, это URL. Либо извлеките последнюю часть из URL-адреса, либо вы можете проверить ответ HTTP на что-то вроде

content-disposition: attachment;filename="foo.bar"

Этот заголовок может быть установлен сервером, чтобы указать, что имя файла - foo.bar. Обычно это используется для загрузки файлов или чего-то подобного.

person Andreas Jung    schedule 02.08.2012

Я искал ваш вопрос в Google и увидел, что на него ответили в stackoverflow, прежде чем я поверил.

Попробуйте посмотреть этот пост:

Использование urllib2 в Python. Как узнать имя загружаемого файла?

Имя файла обычно включается сервером через заголовок content-disposition:

content-disposition: attachment; filename=foo.pdf

У вас есть доступ к заголовкам через

result = urllib2.urlopen(...)
result.info() <- contains the headers


i>>> import urllib2
ur>>> result = urllib2.urlopen('http://zopyx.com')
>>> print result
<addinfourl at 4302289808 whose fp = <socket._fileobject object at 0x1006dd5d0>>
>>> result.info()
<httplib.HTTPMessage instance at 0x1006fbab8>
>>> result.info().headers
['Date: Mon, 04 Apr 2011 02:08:28 GMT\r\n', 'Server: Zope/(unreleased version, python 2.4.6, linux2) ZServer/1.1

Plone/3.3.4\r\n', 'Длина контента: 15321\r\n', 'Тип контента: text/html; charset=utf-8\r\n', 'Через: 1.1 www.zopyx.com\r\n', 'Cache-Control: max-age=3600\r\n', 'Истекает: понедельник, 04 апреля 2011 г. 03:08:28 GMT\r\n', 'Соединение: закрыть\r\n']

Видеть

http://docs.python.org/library/urllib2.html

person gmlime    schedule 02.08.2012