¿Qué significa este error en sopa hermosa?

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.