2013-01-29 3 views
1

Я делаю небольшой скрипт с помощью PyQt4 и BeautifulSoup. В основном вы указываете url и сценарий, который должен загружать все pic с веб-страницы.Что это за ошибка в красивом супе?

В выходе, когда я обеспечиваю http://yahoo.com он загружает все изображения, кроме одного:

... 
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' 

выход из http://stackoverflow.com является:

Download Complete 
File name is wrong h 
Download Complete 

И, наконец, вот часть кода:

# 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" 

ответ

1

Это означает, что image элемент не имеет атрибута "src", и вы получаете ту же ошибку дважды: один раз в file_name = image['src'].split('/')[-1] и после этого в исключающем блоке 'File name is wrong ',image['src'].


Самый простой способ избежать этой проблемы было бы заменить soup.findAll('img') с soup.findAll('img',{"src":True}) поэтому было бы найти только те элементы, которые имеют атрибут src.


Если есть две возможности, попробовать что-то вроде:

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 
+0

Ошибка возникает из 'file_name = image ['src']. Split ('/') [- 1]' – That1Guy

+0

@ That1Guy - вы правы, исправлено за 3 секунды до вашего комментария: P – root

+0

@Vor - Чтобы избежать этой проблемы, попробуйте: 'soup.findAll ('img', {" src ": True})' – root

2

Хорошо, так это то, что происходит. В вашем try-except вы получаете KeyError от file_name = image['src'].split('/')[-1], потому что этот объект не имеет атрибута src.

Затем, после вашего оператора except, вы пытаетесь получить доступ к тому же атрибуту, который вызвал ошибку: print 'File name is wrong ',image['src'].

Исследуйте тег img, вызывая ошибку и переоценивая вашу логику для этих случаев.

+0

Итак, если я проверю в начале, если img имеет атрибут src, то он должен работать, правильно? – Vor

+0

Это устранит ошибку, но не загрузит изображение. Осмотрите элемент, который вызывает ошибку, чтобы найти другой способ ее загрузки. – That1Guy

Смежные вопросы