На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: RaD
  
    > Проблема с HtmlParser (Phyton), пропускает теги
      Здравствуйте, помогите пожалуйста новичку.
      Есть скрипт, сохраняющий все картинки из html кода по веб ссылке на веб страницу.
      Проблема в том, что он пропускает картинки. Сохраняет не все.
      А именно метод handle_starttag с тегом img вызывается не для каждого тега img, т.е. происходит пропуск.
      Помогите, пожалуйста, понять в чем причина. Код скрипта привожу ниже

      ExpandedWrap disabled
        """
        Place files under C:\Python27\task
        Usage C:\Python27\python.exe 1.py http://www.google.ru
         
        """
        import urllib2,urllib
        from urllib2 import URLError as urlError
        from HTMLParser import HTMLParser as HtmlParser
        import re
        import sys, traceback
        import os
         
        from optparse import OptionParser
         
        class LinkParser2(HtmlParser):
            def __init__(self):
                HtmlParser.__init__(self)
                self.links = []
         
            def handle_starttag(self, tag, attrs):
                #print attrs
                #print "/n"
                #print tag
                #print attrs
                if (tag == "img"):
                    print "ok"
                    for attr in attrs:
                        if (attr[0] != 'src'):
                            #print "skip this one"
                            continue
                        if (len(attr) < 2):
                            continue
                        if ((attr[1] != "") and (attr[1] != None)):
                            self.links.append(attr[1])
         
        def exitWithError(error):
            print 'error : ' + error
            exit()
         
        def getPageSource(url):
            page = urllib2.urlopen(url)
            rpage = page.read()
            page.close()
            print rpage
            return rpage
            
         
        def getSiteFromUrl(url):
            if ((url == None) or(url == '')):
               return None
            siteRe = re.compile(r'^(https?://)?([\da-z\.-]*\.)?(?P<site>[\da-z\.-]+\.[a-z\.]{2,6})')
            res = siteRe.match(url)  
            if (res):
                return res.groupdict()["site"]
            else:
                return None
        if __name__ == '__main__':
            op = OptionParser(description = 'getting external links from site'
                              , prog = 'extHrefs'
                              , usage = '%prog [-a] url')
            op.add_option('--all', '-a'
                           , action = 'store_true'
                           , help = 'print all links'
                           , default = False)
            opts, args = op.parse_args()
            if (len(args) != 1):
                op.print_help()
                exit()
         
            url = args[0]
            try:
                source = getPageSource(url)
            except ValueError:
                exitWithError('wrong url - ' + url)
            except urlError:
                exitWithError("can't find url - " + url)
            except:
                traceback.print_exc()
                exitWithError("unknown error with url - " + url)
            
            site = getSiteFromUrl(url)
         
            linkParser = LinkParser2()
            print 'parsing...'
            linkParser.feed(source)
            print linkParser.links
            for src in linkParser.links:
                #linkSite = getSiteFromUrl(src)
                if not src.startswith('http://'):
                    src = url + src
                try:
                    try:
                      os.makedirs("img")
                    except OSError:
                      pass
         
                    print "src = ", src
                    page = urllib2.urlopen(src)
                    content = page.read()
                    page.close()
                    #print content
                    
                    #urllib.urlretrieve(src,"img/"+src.split('/')[-1])
                    fname = "img/"+src.split('/')[-1]
                    pos = fname.find(".")
                    if pos < 0:
                        fname += ".jpg"
                    pos1 = fname.find("?")
                    if pos1 >= 0:
                        fname = fname[0:pos1]
                    f = open(fname, 'wb')
                    f.write(content)
                    f.close()                        
                        
                except UnicodeEncodeError:
                    print "error while encoding link"
        Может попробовать Beautiful Soup?

        Цитата Tigra @
        А именно метод handle_starttag с тегом img вызывается не для каждого тега img, т.е. происходит пропуск.
        Помогите, пожалуйста, понять в чем причина. Код скрипта привожу ниже

        А уверены, что эти пропущенные теги сформированы корректно? :)
          Beautiful Soup не подойдет... нужно реализовать стандартными библиотеками.
          1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0382 ]   [ 14 queries used ]   [ Generated: 18.07.25, 01:12 GMT ]