Питон | Http - не удается получить правильный тип пантомимы

Я создаю поисковый робот, используя urllib3. Пример кода:

from urllib3 import PoolManager

pool = PoolManager()
response = pool.request("GET", url)
mime_type = response.getheader("content-type")

Я наткнулся на несколько ссылок на файлы документов, такие как docx и epub, и тип mime, который я получаю с сервера, — text/plain. Мне важно получить правильный тип mime.

Пример проблемного URL:

http://lsa.mcgill.ca/pubdocs/files/advancedcommonlawobligations/523-gold_advancedcommonlawobligations_-2013.docx

Сейчас логика получения MIME-типа файла заключается в том, чтобы получить его с сервера и, если он недоступен, попытаться получить расширение файла.

Почему Firefox не запутался в таких URL-адресах и не позволил пользователю сразу загрузить файл? Откуда он знает, что этот файл не является обычным текстом? Как я могу получить правильный тип пантомимы?


person Montoya    schedule 14.11.2016    source источник
comment
Как вы получаете доступ к типу mime в response?   -  person lucasnadalutti    schedule 14.11.2016
comment
Я обновил вопрос.   -  person Montoya    schedule 14.11.2016
comment
Это может быть обходной путь к этому вопросу. Сначала сохраните ответ во временный файл. А затем выберите content-type для сохраненного имени файла. ссылка   -  person kiran.koduru    schedule 14.11.2016
comment
Это помогает мне mime.ritey.com   -  person JinSnow    schedule 18.03.2017


Ответы (2)


Я не читал исходный код Firefox, но я предполагаю, что Firefox либо пытается угадать тип файла на основе URL-адреса, либо отказывается отображать его встроенным, если это определенный тип содержимого и больше некоторого максимального размера, или, возможно, это даже просматривает часть содержимого файла, чтобы выяснить, что оно основано на магическом числе в начале.

Вы можете использовать модуль Python mimetypes в стандартной библиотеке, чтобы угадать тип файла. основан на URL-адресе:

import mimetypes
url = "http://lsa.mcgill.ca/pubdocs/files/advancedcommonlawobligations/523-gold_advancedcommonlawobligations_-2013.docx"
type, encoding = mimetypes.guess_type(url)

В этом случае type равно "application/vnd.openxmlformats-officedocument.wordprocessingml.document", что, вероятно, вам и нужно.

person shazow    schedule 14.11.2016

К сожалению, text/plain является правильным типом MIME для вашего ответа, как указано здесь.

Для текстовых документов без определенного подтипа следует использовать text/plain.

Я проверил ваш URL-адрес в Chrome, и поведение, которое вы описали для Firefox, также произошло: Chrome загрузил файл, а не открыл его, даже если заголовок Content type был text/plain.

введите здесь описание изображения

Это означает, что эти браузеры используют больше, чем просто этот заголовок, чтобы определить, следует ли им загружать или открывать указанный файл, что может включать их собственное ограничение на анализ этого файла.

Тем не менее, вы не можете полагаться на заголовок Content type, если хотите определить реальный MIME-тип того, что придет в ответ на запрос. Возможно, альтернативой является временное сохранение файла ответа и последующее определение его типа MIME.

person lucasnadalutti    schedule 14.11.2016