2015-08-04 24 views
12

Sto usando il Python requests lib per ottenere un file PDF dal web. Funziona bene, ma ora voglio anche il nome file originale. Se vado in un file PDF in Firefox e clicco su download, ha già un nome file definito per salvare il pdf. Come ottengo questo nome file?Come ottenere il nome file pdf con richieste Python?

Ad esempio:

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' 

Ho controllato il r.headers per qualcosa di interessante, ma non c'è il nome del file in là. In realtà speravo in qualcosa come r.filename ..

Qualcuno sa come posso ottenere il nome file di un file PDF scaricato con la libreria delle richieste?

+0

Interessante - Stavo per dire "beh * ovviamente *' 0c9605301e48beda0f000000.pdf' "(come è nella richiesta) ma per fortuna ho deciso di testarlo prima. E FireFox vuole salvarlo come "Mater Sci Eng B47 (1997) 33.pdf". – usr2564301

+0

Come stai controllando le intestazioni? Il nome file _è lì, 'content-disposition: inline; filename = "Mater Sci Eng B47 (1997) 33.pdf" '. FWIW, molti PDF hanno un [Titolo] (http://stackoverflow.com/q/6367304/4014959) incorporato in essi, ma non tutti, e potrebbe non essere facile da accedere se il PDF è in formato binario. –

risposta

21

È specificato in un'intestazione http content-disposition. Quindi, per estrarre il nome si dovrebbe fare:

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

Nome estratta dalla stringa tramite espressioni regolari (re modulo).

+0

Che stupido non l'ho visto. Grazie anche per la regex aggiunta .. :-) – kramer65

+0

Questo non funzionerebbe se il nome del file fosse codificato come utf8. Qualche suggerimento lì? –

4

A quanto pare, per questa particolare risorsa E 'in:

r.headers['content-disposition'] 

Non so se è sempre il caso, però.