2016-06-12 14 views
2

Ich baue einen Web-Crawler mit Python. Aber die urlopen(url) laden Sie die Dateien auf der Seite herunter. Ich möchte nur das HTML lesen und überspringen, wenn die URL auf eine herunterladbare Datei zeigt.Vermeiden Sie herunterladbare Dateien in Python Urlopen

Ich habe versucht, Timeouts

urlopen(url, timeout = 5).read() 

so dass große Dateien verwenden, können vermieden werden, aber dies scheint nicht zu funktionieren.

Ich dachte auch, um eine Liste von gemeinsamen Dateierweiterungen zu machen, und überspringt die URL immer wenn die URL mit der Erweiterung endet.

flag = False 
extensions = ['.zip', '.mp3',....] 
for extension in extensions: 
    if url.endswith(extension): 
     flag = True 
     continue 
if not flag: 
    x = urlopen(url).read() 

Aber diese Methode wird nicht sehr effizient sein, nehme ich an.

Irgendwelche Ideen?

Antwort

2

können Sie die Content-Type HTTP-Header verwenden, um herauszufinden, ob es HTML oder etwas ist anders:

x= urlopen(url) 
if 'text/html' in x.headers.get('Content-Type'): 
    x= x.read() 
+0

ich glaube, er will vor url öffnen? – ravigadila

+0

Sie können nicht direkt, aber Sie können eine 'HEAD' Anfrage machen, um nur die Header zu bekommen, dann untersuchen Sie sie, um festzustellen, ob Sie ein vollständiges' GET' machen wollen. – tripleee

0

die Menge des Dateiinhaltes einzuschränken, um zu überprüfen retcode zu überprüfen, bevor Dateiinhalt zu überprüfen.

doc = urllib.urlopen(url, timeout=5) 
if doc and doc.getCode() == 200 and doc.headers.get('Content-Type').startswith("text/html"): 
    x = doc.read() 
1

Sie können dies erreichen, indem python requests

In [8]: import requests 

In [9]: h = requests.head("http://stackoverflow.com/questions/37771237/avoid-downloadable-files-in-python-urlopen") 

In [10]: if "text/html" in h.headers["content-type"]: 
    ....:  content = requests.get("http://stackoverflow.com/questions/37771237/avoid-downloadable-files-in-python-urlopen").text 
    ....:  
Verwandte Themen