Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 3, 2012 20:22:57

agryn
От: Украина
Зарегистрирован: 2011-12-14
Сообщения: 189
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск слова при использовании grablib (Python 2.7 win)

Есть код для получения содержимого веб страницы с помощью библиотеки grablib (Python 2.7 win)

from grab import Grab
g = Grab()
g.go('http://www.apteka.ua/article/145799?print=1')
Подскажите как далее правильно сделать, что б найти в тексте полученной страницы ключевое слово (например “аптека”), конкретнее его позицию/позиции в текстовом массиве?
Проблема просто вот в чем
если выполнить
g.search(u"843")
или
g.search(u"apteka")
то в обоих случаях выводит True (ети строки однозначно есть в тексте)
но если сделать
g.search(u"здоровья")
то False хотя слово встречается, я так понял опять проблема с кодировкой.
Помогите разобраться, я выбрал grablib для парсинга так как думал что как раз проблем с кодировкой поменьше будет

Отредактировано agryn (Июнь 3, 2012 22:26:55)

Офлайн

#2 Июнь 3, 2012 22:34:11

hedint
Зарегистрирован: 2012-05-16
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск слова при использовании grablib (Python 2.7 win)

Задача несколько нетипичная для парсинга. Обычно нужен конкретный элемент(ы) DOM-дерева.
Способ в лоб -

 
from grab import Grab
g = Grab()
g.go('http://www.apteka.ua/article/145799?print=1')
s = g.response.body #тело ответа
lst = s.split()
word = "аптек"
for i in xrange(0,len(lst)):
    if lst[i].find(word) != -1:
        print "Search success! word - %s Index - %s"%(lst[i],i)
Но уверен, что есть что-то гораздо более логичное, правильное и оптимальное.

Офлайн

#3 Июнь 3, 2012 23:15:19

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

Поиск слова при использовании grablib (Python 2.7 win)

agryn, а что конкретно ты хочешь сделать?

>>> g.search(u'здоровья')
True
ЧЯДНТ? :)

search(self, anchor, byte=False) method of grab.base.Grab instance
Search the substring in response body.

:param anchor: string to search
:param byte: if False then `anchor` should be the
unicode string, and search will be performed in `response.unicode_body()`
else `anchor` should be the byte-string and
search will be performed in `resonse.body`

If substring is found return True else False.
Что за лисопед? Почему бы не определять тип body по типу anchor?

hedint, я бы так не делал.
hedint
word = “аптек”
Оно будет работать, если файл исходника будет в кодировке страницы. Поменяешь ее - все отвалится. Тогда уже так
word = u"аптек".decode('cp1251')



Офлайн

#4 Июнь 9, 2012 12:23:04

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Поиск слова при использовании grablib (Python 2.7 win)

> Что за лисопед? Почему бы не определять тип body по типу anchor?

Я стараюсь использовать миним магии. Мне важно знать, что пользователь Grab понимает, что он ищет. Если начать пытаться угадывать, что хочет пользователь, то придём к тому, что часть пользователей просто не будет понимать, что они делают, но не будут этого знать т.к. до поры до времени библиотека угадывала их желание. Вот, например, человек выше пишет

> так как думал что как раз проблем с кодировкой поменьше будет

Т.е. он просто хочет, чтобы проблем было меньше, не вникая в подробности. А когда проблемы всё же возникают, он не лезет в код, посмотреть как всё устроено, а просто удивляется, почему магия не сработала :)

Кстати, u“здоровья” у меня тоже находится без проблем.

> word = u“аптек”.decode('cp1251')

Что-то вы тут странное написали, если даже не вдаваться в вопрос, почему именно cp1251, то у unicode-строки вы можете вызвать encode, а не decode метод, ну или же префикс u там лишний.

Офлайн

#5 Июнь 9, 2012 13:25:06

plurk89
От:
Зарегистрирован: 2011-06-09
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск слова при использовании grablib (Python 2.7 win)

Попробуйте так:
if g.response.body.find(u'WORD')>0:
blablablaGjg



Офлайн

#6 Июнь 11, 2012 14:57:00

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Поиск слова при использовании grablib (Python 2.7 win)

В response.body содержатся байтовые, а не уникодовые данные. А ещё при использовании find метода, надо сравнивать с -1, а не нулём.

Офлайн

#7 Июнь 13, 2012 10:01:18

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

Поиск слова при использовании grablib (Python 2.7 win)

lorien
> word = u“аптек”.decode('cp1251')

Что-то вы тут странное написали, если даже не вдаваться в вопрос, почему именно cp1251, то у unicode-строки вы можете вызвать encode, а не decode метод, ну или же префикс u там лишний.
Да, надо encode. Ну а почему 1251 - догадайся сам.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version