Форум сайта python.su
31
Может
try: except:
Офлайн
0
sanodinя думал над этим. Но пока не понял, как их правиьно применить. А точнее, что в них вписать
try: except:
Офлайн
31
Можно так
for elem in grab.doc.select('//img'): #топаем по ссылке в теге img try: grab.go(elem.attr('src')) except: pass
Офлайн
0
Вот что у меня вышло, правда не реализовал, проверку размера картинки. Не осилил опять
Практического примнения ни какого конечно, но мжет кому-то пригодиться
Может что-то можно исправить и сделать лучше?
Да, некоторые картинки все равно не читаемые
#!/usr/bin/env python #coding=utf-8 import re import sys from mimetypes import MimeTypes from grab import Grab ''' Имеется html-документ — результат поиска в Google. Необходимо выделить из него ссылки на первые 5 ресурсов и загрузить все изображения, размером более чем 64x64 пикселя, расположенные по этим ссылкам ''' grab = Grab() #grab.setup(proxy='192.168.0.81:8080', proxy_type='http') #путь к файлу file_for_read = '2.html' #откроем файл для чтения f = open(file_for_read, 'r') #прочтем файл text = f.read() f.close() #Шаблон поиска №1: p = re.compile('<a\shref=\"(http://[0-9a-z.\-\/\?\&\=\_\%]*)',re.IGNORECASE) #Найдем все вхождения: m = p.findall(text) mime = MimeTypes() i = 0 while i != 5: #идем по i -ссылке grab.go(m[i]) j = 1 #Перебираем в полученном по ссылке документу теги img for elem in grab.doc.select('//img'): try: #топаем по ссылке в теге img grab.go(elem.attr('src')) #определяем тип картинки type = mime.guess_type(elem.attr('src')) #придумываем расширение if type[0] == 'image/jpeg': ext = 'jpeg' elif type[0] == 'image/png': ext = 'png' elif type[0] == 'image/gif': ext = 'gif' else : ext = 'none' #если расширение придумалось, то записываем по ссылке из src файл картинки if ext != 'none': with open('result/'+str(i)+str(j)+'.'+ext, 'wb') as f: f.write(grab.response.body) f.close() except: pass j += 1 i += 1 sys.exit()
Отредактировано rizan (Май 16, 2014 16:45:24)
Офлайн
31
rizanhttp://habrahabr.ru/post/199440/
проверку размера картинки
Офлайн
857
rizanчерез PIL легко делается
не реализовал, проверку размера картинки
Офлайн
0
Вот, как то так
grab.go(elem.attr('src')) img = Image.open(StringIO.StringIO(grab.response.body)) imgSize = img.size text = str(grab.response.headers) shablon = 'Content-Type:\simage\/(png|jpeg|gif)' pt = re.compile(shablon) mp = pt.findall(text) if mp[0]: if imgSize > (64,64): with open('result/'+str(i)+str(j)+'.'+mp[0], 'wb') as f: f.write(grab.response.body) f.close()
Офлайн
0
Полный код
#!/usr/bin/python #coding=utf-8 import re import sys from grab import Grab from PIL import Image import logging import StringIO ''' Имеется html-документ — результат поиска в Google. Необходимо выделить из него ссылки на первые 5 ресурсов и загрузить все изображения, размером более чем 64x64 пикселя, расположенные по этим ссылкам Вычленение ссылок из исходного файла осуществляется при помощи регулярных выражений ''' ##Функции def read_file(file_for_read): ''' функция для чтения текста из файла в переменную''' f = open(file_for_read, 'r') text = f.read() f.close() return text def get_match(a_pattern, text): '''функция поиска нужных вхождений в тексте по заданному шаблону text - исходный текст, a_pattern - шаблон поиска возвращает список совпадений''' p = re.compile(a_pattern,re.IGNORECASE) m = p.findall(text) return m ##Переменные file_for_read = '2.html' #путь к файлу "html-документ — результат поиска в Google" a_pattern = '<a\shref=\"(http://[0-9a-z.\-\/\?\&\=\_\%]*)' #Шаблон поиска ссылок e_pattern = 'Content-Type:\simage\/(png|jpeg|gif)' #шаблон для определения типа файла в header'e ## grab = Grab() #grab.setup(proxy='192.168.0.81:8080', proxy_type='http') text = read_file(file_for_read) #считаем исходный файл в переменную. aList = get_match(a_pattern,text) #Найдем список необходимых ссылокпо заданному шаблону i = 0 while i != 5: #обходим первые пять ссылок grab.go(aList[i]) #идем по i -ссылке j = 0 for elem in grab.doc.select('//img'): #Перебираем в полученном по ссылке документе теги img try: j += 1 logging.basicConfig(level=logging.DEBUG) grab.go(elem.attr('src')) #топаем по ссылке в теге img img = Image.open(StringIO.StringIO(grab.response.body)) #Передаем объект imgSize = img.size #Получаем размер изображения text = str(grab.response.headers) #получаем текст заголовков extList = get_match(e_pattern,text) #получаем тип (расширение) файла if extList[0]: #Если расширение нужное есть if imgSize > (64,64): #И если размер картинки подходящий with open('result/'+str(i)+str(j)+'.'+extList[0], 'wb') as f: f.write(grab.response.body) f.close() #то сохраняем картинку except: pass i += 1 print 'Ok. Done' sys.exit()
Офлайн