2015-08-04 5 views
12

Ich benutze die Python requests lib, um eine PDF-Datei aus dem Internet zu erhalten. Das funktioniert gut, aber ich möchte jetzt auch den ursprünglichen Dateinamen. Wenn ich in Firefox eine PDF-Datei öffne und download anklicke, ist bereits ein Dateiname zum Speichern der PDF-Datei definiert. Wie bekomme ich diesen Dateinamen?Wie bekomme ich PDF-Dateiname mit Python-Anfragen?

Zum Beispiel:

import requests 
r = requests.get('http://www.researchgate.net/profile/M_Gotic/publication/260197848_Mater_Sci_Eng_B47_%281997%29_33/links/0c9605301e48beda0f000000.pdf') 
print r.headers['content-type'] # prints 'application/pdf' 

überprüfte ich die r.headers für alles interessant, aber es gibt keinen Dateinamen drin. Ich habe gehofft, tatsächlich für so etwas wie r.filename ..

Weiß jemand, wie ich mit Anfragen Bibliothek die Dateinamen eine heruntergeladenen PDF-Datei zu bekommen?

+0

Interessant - ich sagen würde, „gut * natürlich *' 0c9605301e48beda0f000000.pdf'“(wie in der Anfrage), aber zum Glück habe ich beschlossen, es zunächst zu testen. Und FireFox möchte es als "Mater Sci Eng B47 (1997) 33.pdf" speichern. – usr2564301

+0

Wie überprüfen Sie die Header? Der Dateiname _ist_ dort, 'content-disposition: inline; Dateiname = "Mater Sci Eng B47 (1997) 33.pdf" '. FWIW, viele PDFs haben einen eingebetteten [Title] (http://stackoverflow.com/q/6367304/4014959), aber nicht alle, und es ist möglicherweise nicht einfach zu erreichen, wenn das PDF in binärer Form vorliegt. –

Antwort

21

Es ist content-disposition in einem HTTP-Header angegeben. Also, den Namen extrahieren Sie tun würde:

import re 
d = r.headers['content-disposition'] 
fname = re.findall("filename=(.+)", d) 

Namen aus der Zeichenfolge über reguläre Ausdrücke extrahiert (re Modul).

+0

Wie dumm, dass ich das nicht gesehen habe. Danke auch für die hinzugefügte Regex .. :-) – kramer65

+0

Dies würde nicht funktionieren, wenn der Dateiname als utf8 codiert ist. Irgendwelche Vorschläge dort? –

4

offenbar für diese besondere Ressource ist es in:

r.headers['content-disposition'] 

Weiß nicht, ob es immer der Fall ist, wenn.