2016-11-14 7 views
3

Ich baue einen Web-Crawler mit urllib3. Beispielcode:Python | Http - kann den richtigen Mime-Typ nicht bekommen

from urllib3 import PoolManager 

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

ich auf einige Links gestolpert Dateien zu dokumentieren wie docx und epub und den MIME-Typ bin ich vom Server bekommen ist text/plain .Es mir wichtig ist, die richtige Mime zu bekommen Art.

Beispiel zu einer problematischen url:

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

Im Augenblick ist die Logik der Mime-Typ Datei bekommen wird sie vom Server bekommen und wenn nicht verfügbar versuchen die Dateierweiterung zu erhalten.

Wie kommt es, dass Firefox nicht durch diese Art von URLs verwirrt wird und der Benutzer die Datei sofort herunterladen kann? Woher weiß es, dass diese Datei kein einfacher Text ist? Wie kann ich den richtigen Mime-Typ bekommen?

+0

Wie greifen Sie auf den Mime-Typ in der "Antwort" zu? – lucasnadalutti

+0

Ich habe die Frage aktualisiert. –

+0

Dies könnte ein Workaround für diese Frage sein. Speichern Sie zuerst die Antwort in einer temporären Datei. Und dann holen Sie den 'content-type' für den gespeicherten Dateinamen. [link] (http://stackoverflow.com/questions/43580/how-to-find-the-mime-type-of-a-file-in-python) –

Antwort

1

Ich habe den Firefox-Quellcode nicht gelesen, aber ich würde vermuten, dass Firefox entweder versucht, den Dateityp anhand der URL zu erraten, oder es inline nicht rendert, wenn es einen bestimmten Inhaltstyp und größer als einige maximale Größe ist oder vielleicht prüft es sogar einen Teil des Dateiinhalts, um herauszufinden, was es am Anfang auf einem magic number basiert.

Sie können den Python mimetypes module in der Standardbibliothek verwenden, zu erraten, was der Dateityp auf der URL basiert:

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

In diesem Fall ist type"application/vnd.openxmlformats-officedocument.wordprocessingml.document" was wahrscheinlich ist, was Sie wollen.

1

Leider ist text/plain der richtige MIME-Typ für Ihre Antwort, wie angegeben here.

Für Textdokumente ohne spezifischen Subtyp sollte text/plain verwendet werden.

testete ich die URL in Chrome und das Verhalten, das Sie für Firefox beschrieben passierte auch: Chrome die Datei heruntergeladen, anstatt es zu öffnen, auch mit dem Content type Kopf text/plain zu sein.

enter image description here

Dies bedeutet, dass dieser Browser mehr verwenden, als nur diesen Header, um zu bestimmen, ob sie die besagte Datei herunterladen oder öffnen soll, die ihre eigene Beschränkung umfassen könnte, dass die Datei zu analysieren.

Das heißt, Sie sind nicht in der Lage, auf die Content type Header zu verlassen, wenn Sie den tatsächlichen MIME-Typ von was auch immer in der Antwort der Anfrage kommen soll bestimmen. Vielleicht ist es eine Alternative, die Antwortdatei vorübergehend zu speichern und anschließend ihren MIME-Typ zu bestimmen.

Verwandte Themen