Поиск в тексте документа — Grab 0.6.30 documentation

### Navigation

- index
- modules |
- next |
- previous |
- Grab 0.6.30 documentation »

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

## Поиск строк

Методом `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.doc.text_search(u'<title>')
    True
    >>> g.doc.text_search(u'Омск')
    True
    >>> g.doc.text_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.doc.text_search(u'Омск'.encode('cp1251'), byte=True)
    True
    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

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

Метод `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.doc.rex_text('<title>([^>]+)</title>')
    u'Linode - Xen VPS Hosting'

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

### Navigation

- index
- modules |
- next |
- previous |
- Grab 0.6.30 documentation »