LINUX.ORG.RU

регэкспы, python


0

0

Пытаюсь получить ссылки на картинки в странице получаемой от images.google.com, получается не очень. Попробовал такой регэксп: (r'imgurl\\x3d(http://.+jpg|png)', re.DOTALL | re.IGNORECASE)
Оно возвращает строку начиная с первого появления imgurl\\x3d и заканчивая последним jpg или png. Как бы его поправить?

★★

Ответ на: комментарий от Absurd

Спасибо, это помогло. Возникла другая проблема: пишу скриптек в idle на питоне 3.0. У меня лежит сохранённый html файл на диске. Так вот


res11 - строка загруженная из файлека
se    - скопипастил из kate

>>> RE_IMAGEURL = re.compile(r'imgurl\\x3d(http://.+?jpg|png)',
re.DOTALL | re.IGNORECASE)

>>> len(RE_IMAGEURL.findall(se))
20
>>> len(RE_IMAGEURL.findall(res11))
0
>>> for i in range(3000):
	if se[i] != res11[i]:
		print (i);break	

223

>>> se [200:230]
'CSIE:"17259",kHL:"en"};\nwindow'
>>> res11[200:230]
'CSIE:"17259",kHL:"en"};\\nwindo'

Кароче если файл загружен с диска или через url, то ничего найти не удаётся. Подскажите пожалуста кто может в чём здесь дело? 

Leron ★★
() автор топика
Ответ на: комментарий от Leron

в 3 питоне данные из файлов\сети не типа str, т.е.

>>> open('test.py', 'rb').read().__class__
<class 'bytes'>
>>> open('test.py', 'r').read().__class__
<class 'str'>

наверное надо из bytes перевести в str

Minmax
()
Ответ на: комментарий от Minmax

Теперь выяснилось что скрипт работает только под виндой. На линуксе получается файлик размером 3.8 кбайт и если его открыть в браузере то видно такую надпись b'fef\r\n\n . Под виндой сохраняется нормальная страничка - 36кбайт. Хз что за хрень. Привожу сдесь текст скрипта

# -*- coding: utf-8 -*-

import os
import re
import urllib.request
import urllib.parse

class googleImages(object):
    
    def __init__(self):
        #self.RE_IMAGEURL = re.compile('imgurl=(http://.+?)&', re.DOTALL | re.IGNORECASE)
        self.RE_IMAGEURL = re.compile(r'imgurl\\x3d(http://.+?jpg|png)', re.DOTALL | re.IGNORECASE)
        self.imagesURLs = []
    
    def getImages(self, imageName=None, count=1,imsize=""):
        "imageName - чего искать, count - сколько страниц, imsize - small, big или huge"

        imsizes = dict(small="icon",big="xxlarge",huge="huge")
        
        imageName = urllib.parse.urlencode(dict(q=imageName))
        
        htmlPage = ''
        request = ''

        count = range(0,count*20,20) # нумерация страниц для гугля
        for i in count:
            requestURL = 'http://images.google.ru/images?%s&hl=en&start=%d&imgsz=%s' % (imageName,i,imsizes.get(imsize,''))

            requestHeaders = {'User-Agent':'Mozilla/5.0'}
    
            request = urllib.request.Request(requestURL, None, requestHeaders)
            print (requestURL)
            htmlPage = urllib.request.urlopen(request).read(500000)
            htmlPage=str(htmlPage)

            with open("/home/leron/google.html",'w') as f:
                f.write(htmlPage)
                f.close()

            results = self.RE_IMAGEURL.findall(htmlPage)
            print ("results:" ,results)

#код сохраняющий картинки на диск пропущен

if __name__ == '__main__':
    img = googleImages()
    img.getImages("python")
    print ("загрузка завершена")

Leron ★★
() автор топика
Ответ на: комментарий от Leron

надо не str(htmlPage)
а .decode('utf-8'), ну или кукаю другую кодировку

попридираюсь )

1 работу с urlopen оберни в with
2 read(500000) - откуда 500000 ?
3 регэкспы вынеси в 
class Foo(object):
    r = re.compile(...)
4 Request(requestURL, None, requestHeaders), заменить на Request(requestURL, headers=requestHeaders)

и успехов с 3 питоном )

ps мне кажется пока нет смысла на него переходить, ибо либ маловато

Minmax
()
Ответ на: комментарий от Minmax

Спасибо, Minmax. Я то думал str по умолчанию utf-8 и юникодную страничку поймёт правильно. Проблемы с загрузкой страницы были из-за старой версии питона - 3.0b3, обновление до 3.0.1 помогло.

Leron ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.