Estoy haciendo un pequeño script usando PyQt4 y BeautifulSoup. Básicamente, usted especifica la URL y la secuencia de comandos para descargar todas las fotos de la página web.
En la salida, cuando proporciono http://yahoo.com , descarga todas las imágenes excepto una:
... Download Complete Download Complete File name is wrong Traceback (most recent call last): File "./picture_downloader.py", line 41, in loadComplete self.download_image() File "./picture_downloader.py", line 58, in download_image print 'File name is wrong ',image['src'] File "/usr/local/lib/python2.7/dist-packages/beautifulsoup4-4.1.3-py2.7.egg/bs4/element.py", line 879, in __getitem__ return self.attrs[key] KeyError: 'src'
La salida de http://stackoverflow.com es:
Download Complete File name is wrong h Download Complete
Y finalmente, aquí está parte del código:
# SLOT for loadFinished def loadComplete(self): self.download_image() def download_image(self): html = unicode(self.frame.toHtml()).encode('utf-8') soup = bs(html) for image in soup.findAll('img'): try: file_name = image['src'].split('/')[-1] cur_path = os.path.abspath(os.curdir) if not os.path.exists(os.path.join(cur_path, 'images/')): os.makedirs(os.path.join(cur_path, 'images/')) f_path = os.path.join(cur_path, 'images/%s' % file_name) urlretrieve(image['src'], f_path) print "Download Complete" except: print 'File name is wrong ',image['src'] print "No more pictures on the page"
Esto significa que el elemento de image
no tiene un atributo "src"
, y obtienes el mismo error dos veces: una vez en file_name = image['src'].split('/')[-1]
y luego en la excepto el bloque 'File name is wrong ',image['src']
.
La forma más sencilla de evitar el problema sería reemplazar soup.findAll('img')
con soup.findAll('img',{"src":True})
para que solo encuentre los elementos que tienen un atributo src
.
Si hay dos posibilidades, intente algo como:
for image in soup.findAll('img'): v = image.get('src', image.get('dfr-src')) # get's "src", else "dfr_src" # if both are missing - None if v is None: continue # continue loop with the next image # do your stuff
Ok, entonces esto es lo que está pasando. Dentro de su bash, excepto que obtiene un KeyError
de KeyError
file_name = image['src'].split('/')[-1]
porque ese objeto no tiene un atributo src
.
Luego, después de su statement de except
, está intentando acceder al mismo atributo que causó el error: print 'File name is wrong ',image['src']
.
Examine la etiqueta img
causa el error y vuelva a evaluar su lógica para esos casos.