agryn
Июнь 3, 2012 20:22:57
Есть код для получения содержимого веб страницы с помощью библиотеки grablib (Python 2.7 win)
from grab import Grab
g = Grab()
g.go('http://www.apteka.ua/article/145799?print=1')
Подскажите как далее правильно сделать, что б найти в тексте полученной страницы ключевое слово (например “аптека”), конкретнее его позицию/позиции в текстовом массиве?
Проблема просто вот в чем
если выполнить
или
то в обоих случаях выводит True (ети строки однозначно есть в тексте)
но если сделать
то False хотя слово встречается, я так понял опять проблема с кодировкой.
Помогите разобраться, я выбрал grablib для парсинга так как думал что как раз проблем с кодировкой поменьше будет
hedint
Июнь 3, 2012 22:34:11
Задача несколько нетипичная для парсинга. Обычно нужен конкретный элемент(ы) 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)
Но уверен, что есть что-то гораздо более логичное, правильное и оптимальное.
asilyator
Июнь 3, 2012 23:15:19
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')
lorien
Июнь 9, 2012 12:23:04
> Что за лисопед? Почему бы не определять тип body по типу anchor?
Я стараюсь использовать миним магии. Мне важно знать, что пользователь Grab понимает, что он ищет. Если начать пытаться угадывать, что хочет пользователь, то придём к тому, что часть пользователей просто не будет понимать, что они делают, но не будут этого знать т.к. до поры до времени библиотека угадывала их желание. Вот, например, человек выше пишет
> так как думал что как раз проблем с кодировкой поменьше будет
Т.е. он просто хочет, чтобы проблем было меньше, не вникая в подробности. А когда проблемы всё же возникают, он не лезет в код, посмотреть как всё устроено, а просто удивляется, почему магия не сработала :)
Кстати, u“здоровья” у меня тоже находится без проблем.
> word = u“аптек”.decode('cp1251')
Что-то вы тут странное написали, если даже не вдаваться в вопрос, почему именно cp1251, то у unicode-строки вы можете вызвать encode, а не decode метод, ну или же префикс u там лишний.
plurk89
Июнь 9, 2012 13:25:06
Попробуйте так:
if g.response.body.find(u'WORD')>0:
blablablaGjg
lorien
Июнь 11, 2012 14:57:00
В response.body содержатся байтовые, а не уникодовые данные. А ещё при использовании find метода, надо сравнивать с -1, а не нулём.
asilyator
Июнь 13, 2012 10:01:18
lorien
> word = u“аптек”.decode('cp1251')
Что-то вы тут странное написали, если даже не вдаваться в вопрос, почему именно cp1251, то у unicode-строки вы можете вызвать encode, а не decode метод, ну или же префикс u там лишний.
Да, надо encode. Ну а почему 1251 - догадайся сам.