Grab
latest
  • Введение в Grab
  • Установка библиотеки Grab
  • Настройка Grab-объекта
  • Отладка запросов
  • Полный список настроек
  • Настройка HTTP-заголовков
  • Методы HTTP-запросов
  • Прочие возможности
  • Кодировка документа
  • Работа с кукисами
  • Обработка сетевых ошибок, таймауты
  • Работа с прокси-серверами
  • Работа с ответом
  • Технические детали устройства Grab
  • Работа с формами
  • Работа с DOM-деревом
  • Поиск в тексте документа
    • Поиск строк
    • Поиск регулярных выражений
  • Другие расширения
  • Cетевые транспорты
  • Полезные утилиты
  • Что такое Spider
  • Способы создания заданий
  • Задания
  • Очередь заданий
  • Обработка ошибок
  • Система кэширования сетевых запросов
  • grab.base: API базового класса
  • grab.error: классы исключений
  • grab.response: класс ответа сервера
  • grab.upload
 
Grab
  • Docs »
  • Поиск в тексте документа
  • Edit on GitHub

Поиск в тексте документа¶

Поиск строк¶

Методом search() можно установить наличие или отсутствие текстового фрагмента в исходном коде документа. Обратите внимание, что поиск проводится именно в HTML-коде, а не в объединение текстового содержимого всех элементов документа.

Может оказаться полезным метод assert_substring(), единственное назначение которого выбросить DataNotFound исключение, если искомая строка не найдена. Для проверки существования хотя бы одной строки из множества, можно использовать метод assert_substrings().

По-умолчанию, описанные методы ожидают аргумент в unicode-виде и проводят поиск в grab.response.Response.unicode_body(). Если вы хотите искать байтовую строку в grab.response.Response.body, передайте дополнительный аргумент byte=True в поисковый метод:

>>> g.go('http://forum.omsk.com')
<grab.response.Response object at 0x1910f10>
>>> g.search(u'<title>')
True
>>> g.search(u'Омск')
True
>>> g.search('Омск')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.6/dist-packages/grab/ext/text.py", line 36, in search
    raise GrabMisuseError('The anchor should be byte string in non-byte mode')
grab.error.GrabMisuseError: The anchor should be byte string in non-byte mode
>>> g.search(u'Омск'.encode('cp1251'), byte=True)
True

Поиск регулярных выражений¶

Метод rex() позволяет искать регулярное выражение в исходном коде документа. В качестве аргумента вы можете передать либо уже скомпилированный объект регулярного выражения либо текстовую строку, которая будет скомпилирована в объект регулярного выражения автоматически.

Если вам нужно извлечь из исхоного кода некоторый фрагмент, может оказаться полезным метод rex_text(), который ищет регулярное выражение и возвращает первую группу из него:

>>> g.go('http://linode.com')
<grab.response.Response object at 0x20a8150>
>>> g.rex(re.compile('<title>[^>]+</title>')).group(0)
u'<title>Linode - Xen VPS Hosting</title>'
>>> g.rex('<title>[^>]+</title>').group(0)
u'<title>Linode - Xen VPS Hosting</title>'
>>> g.rex_text('<title>([^>]+)</title>')
u'Linode - Xen VPS Hosting'

Метод assert_rex() по принципу действия аналогичен методу assert_substring().

Next Previous

© Copyright 2011, Grigoriy Petukhov. Revision bbc179330fe712150ffb7095856c1b74b9bf1590.

Built with Sphinx using a theme provided by Read the Docs.