имя файла urllib2 - PullRequest
       43

имя файла urllib2

31 голосов
/ 02 октября 2008

Если я открою файл, используя urllib2, примерно так:

remotefile = urllib2.urlopen('http://example.com/somefile.zip')

Есть ли простой способ получить имя файла, отличное от парсинга исходного URL?

РЕДАКТИРОВАТЬ: изменил openfile на urlopen ... не знаю, как это произошло.

РЕДАКТИРОВАТЬ 2: я закончил с использованием:

filename = url.split('/')[-1].split('#')[0].split('?')[0]

Если я не ошибаюсь, это также должно исключить все потенциальные запросы.

Ответы [ 14 ]

0 голосов
/ 11 апреля 2016

Использование PurePosixPath , которое не зависит от операционной системы и изящно обрабатывает URL-адреса, является питоническим решением:

>>> from pathlib import PurePosixPath
>>> path = PurePosixPath('http://example.com/somefile.zip')
>>> path.name
'somefile.zip'
>>> path = PurePosixPath('http://example.com/nested/somefile.zip')
>>> path.name
'somefile.zip'

Обратите внимание, что здесь нет сетевого трафика или чего-либо еще (т. Е. Эти URL никуда не ходят) - просто с использованием стандартных правил синтаксического анализа.

0 голосов
/ 11 сентября 2015

Вы, вероятно, можете использовать простое регулярное выражение здесь. Что-то вроде:

In [26]: import re
In [27]: pat = re.compile('.+[\/\?#=]([\w-]+\.[\w-]+(?:\.[\w-]+)?$)')
In [28]: test_set 

['http://www.google.com/a341.tar.gz',
 'http://www.google.com/a341.gz',
 'http://www.google.com/asdasd/aadssd.gz',
 'http://www.google.com/asdasd?aadssd.gz',
 'http://www.google.com/asdasd#blah.gz',
 'http://www.google.com/asdasd?filename=xxxbl.gz']

In [30]: for url in test_set:
   ....:     match = pat.match(url)
   ....:     if match and match.groups():
   ....:         print(match.groups()[0])
   ....:         

a341.tar.gz
a341.gz
aadssd.gz
aadssd.gz
blah.gz
xxxbl.gz
0 голосов
/ 27 февраля 2014

используя запросы, но вы можете сделать это легко с помощью urllib (2)

import requests
from urllib import unquote
from urlparse import urlparse

sample = requests.get(url)

if sample.status_code == 200:
    #has_key not work here, and this help avoid problem with names

    if filename == False:

        if 'content-disposition' in sample.headers.keys():
            filename = sample.headers['content-disposition'].split('filename=')[-1].replace('"','').replace(';','')

        else:

            filename = urlparse(sample.url).query.split('/')[-1].split('=')[-1].split('&')[-1]

            if not filename:

                if url.split('/')[-1] != '':
                    filename = sample.url.split('/')[-1].split('=')[-1].split('&')[-1]
                    filename = unquote(filename)
0 голосов
/ 02 октября 2008
import os,urllib2
resp = urllib2.urlopen('http://www.example.com/index.html')
my_url = resp.geturl()

os.path.split(my_url)[1]

# 'index.html'

Это не openfile, но, возможно, все еще помогает:)

...