модуль, как :

отрим следующие URL

http://m3u.com/tunein.m3u
http://asxsomeurl.com/listen.asx:8024
http://www.plssomeotherurl.com/station.pls?id=111
http://22.198.133.16:8024

Как правильно определить расширения файлов (.m3u / .asx / .pls)? Очевидно, что последний не имеет расширения файла.

РЕДАКТИРОВАТЬ: я забыл упомянуть, что m3u / asx / pls являются списками воспроизведения (текстовые файлы) для аудиопотоков и должны быть проанализированы по-разному. Цель - определить расширение, а затем отправить URL-адрес соответствующей функции синтаксического анализа. Например.


url = argv[1]
ext = GetExtension(url)
if ext == "pls":
  realurl = ParsePLS(url)
elif ext == "asx":
  realurl = ParseASX(url)
(etc.)
else:
  realurl = url
Play(realurl)
GetExtension () должен возвращать расширение файла (если есть), желательно без подключения к URL.

 Marcus Whybrow23 янв. 2011 г., 23:20
Вы можете найти этот ТАК вопросstackoverflow.com/questions/2277030 полезно.
 frigg23 янв. 2011 г., 23:50
Проверьте последние изменения.
 Fred Nurk23 янв. 2011 г., 23:25
Что вы хотите сделать с расширением файла, и как вы будете обрабатывать файл, не соответствующий типу файла, который, по вашему мнению, должен иметь расширение?
 Corey Goldberg23 янв. 2011 г., 23:22
что вы ожидаете в случае без расширения?

Ответы на вопрос(9)

который не учитывает ничего другого, кроме фактического расширения файла из URL:

def fileExt( url ):
    # compile regular expressions
    reQuery = re.compile( r'\?.*

edit: добавлена ​​обработка явных портов от: 1234

, re.IGNORECASE ) rePort = re.compile( r':[0-9]+', re.IGNORECASE ) reExt = re.compile( r'(\.[A-Za-z0-9]+$)', re.IGNORECASE ) # remove query string url = reQuery.sub( "", url ) # remove port url = rePort.sub( "", url ) # extract ext,ension matches = reExt.search( url ) if None != matches: return matches.group( 1 ) return None

edit: добавлена ​​обработка явных портов от: 1234

Решение Вопроса

Правильный способ не использовать расширения файлов вообще. Выполните запрос GET (или HEAD) к соответствующему URL-адресу и используйте возвращенный HTTP-заголовок «Content-type», чтобы получить тип содержимого. Расширения файлов ненадежны.

ВидетьМультимедийный справочник MIME для списка полезных типов MIME.

 Spacedman23 янв. 2011 г., 23:23
Верно, но что если вы хотите, чтобы всплыл графический интерфейс, чтобы спасти вещь? Какое имя файла вы используете, и какое расширение вы добавляете в диалог сохранения - учитывая URLа также заголовки типа контента?
 Tomasz Elendt23 янв. 2011 г., 23:32
@Spacedman: Вы должны проверить, соответствует ли расширение пути URL mimetype ответа (mimetypes.guess_extension может быть полезно) - если не добавить правильный. AFAIK это то, что делают веб-браузеры.

чтобы получить большинство из перечисленного выше:

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

затем разделите «путь» вверх. Возможно, вам удастся разделить путь, используя os.path.split, но ваш пример 2 с: 8024 на конце требует ручной обработки. Ваши расширения файлов всегда три буквы? Или всегда буквы и цифры? Используйте регулярное выражение.

вы можете написать функцию, подобную той, что я написал, используя urllib2. Если вам все равно нужно использовать содержимое страницы, вполне вероятно, что вы будете использовать urllib2, поэтому нет необходимости импортировать ОС.

import urllib2

def getContentType(pageUrl):
    page = urllib2.urlopen(pageUrl)
    pageHeaders = page.headers
    contentType = pageHeaders.getheader('content-type')
    return contentType

использованиеurlparse разобрать путь из URL, затемos.path.splitext чтобы получить расширение.

import urlparse, os

url = 'http://www.plssomeotherurl.com/station.pls?id=111'
path = urlparse.urlparse(url).path
ext = os.path.splitext(path)[1]

Обратите внимание, что расширение может не быть надежным индикатором типа файла. HTTPContent-Type заголовок может быть лучше.

$ python3
Python 3.1.2 (release31-maint, Sep 17 2010, 20:27:33) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from os.path import splitext
>>> from urllib.parse import urlparse 
>>> 
>>> urls = [
...     'http://m3u.com/tunein.m3u',
...     'http://asxsomeurl.com/listen.asx:8024',
...     'http://www.plssomeotherurl.com/station.pls?id=111',
...     'http://22.198.133.16:8024',
... ]
>>> 
>>> for url in urls:
...     path = urlparse(url).path
...     ext = splitext(path)[1]
...     print(ext)
... 
.m3u
.asx:8024
.pls

>>> 

если вы идете вhttp://code.google.com/p/unladen-swallow/source/browse/branches/release-2009Q1-maint/Lib/psyco/support.py?r=292 Вы хотите, чтобы расширение было ".py", несмотря на то, что страница HTML, а не Python?

Используйте заголовок Content-Type, чтобы определить «тип» URL.

Вы можете попробоватьrfc6266 модуль, как :

import requests
import rfc6266

req = requests.head(downloadLink)
headersContent = req.headers['Content-Disposition']
rfcFilename = rfc6266.parse_headers(headersContent, relaxed=True).filename_unsafe
filename = requests.utils.unquote(rfcFilename)

Это проще всего сrequests а такжеmimetypes:

import requests
import mimetypes

response = requests.get(url)
content_type = response.headers['content-type']
extension = mimetypes.guess_extension(content_type)

Расширение включает префикс точки. Например,extension является'.png' для типа контента'image/png'.

 brokkr22 июн. 2017 г., 09:01
Mimetypes-хguess_extension Функция имеет свои причуды, хотя. Рукаrequest URL-адрес для файла с расширением «.jpg», который идентифицирует его как MIME-тип «image / jpeg». Передай этоmimetypes и спросите его о разумном продлении, и он выплевывает '.jpe'. Не неправильно, просто ... не полезно.
 Seth17 февр. 2014 г., 19:16
Кстати, это предполагает, что вы хотите получить содержимое URL.
 brokkr22 июн. 2017 г., 13:18
Будь то ошибка или WAI, кажется, просто выбрать первое в списке:stackoverflow.com/a/11396288/68595
 Seth22 июн. 2017 г., 12:43
@brokkr да. JPE является действительным, но это звучит как ошибка для меня, какguess_extension не тянет наиболее вероятный / популярный из списка допустимых расширений.
 Seth26 сент. 2017 г., 00:19
@acarayol, если вам не интересен сам ресурс, то да, вы правы.

Ваш ответ на вопрос