Найти - Пользователи
Полная версия: Поиск слова при использовании grablib (Python 2.7 win)
Начало » Python для новичков » Поиск слова при использовании grablib (Python 2.7 win)
1
agryn
Есть код для получения содержимого веб страницы с помощью библиотеки 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 для парсинга так как думал что как раз проблем с кодировкой поменьше будет
hedint
Задача несколько нетипичная для парсинга. Обычно нужен конкретный элемент(ы) 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
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
> Что за лисопед? Почему бы не определять тип body по типу anchor?

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

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

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

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

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

Что-то вы тут странное написали, если даже не вдаваться в вопрос, почему именно cp1251, то у unicode-строки вы можете вызвать encode, а не decode метод, ну или же префикс u там лишний.
plurk89
Попробуйте так:
if g.response.body.find(u'WORD')>0:
blablablaGjg
lorien
В response.body содержатся байтовые, а не уникодовые данные. А ещё при использовании find метода, надо сравнивать с -1, а не нулём.
asilyator
lorien
> word = u“аптек”.decode('cp1251')

Что-то вы тут странное написали, если даже не вдаваться в вопрос, почему именно cp1251, то у unicode-строки вы можете вызвать encode, а не decode метод, ну или же префикс u там лишний.
Да, надо encode. Ну а почему 1251 - догадайся сам.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB