Работа с формами — Grab 0.6.30 documentation

### Navigation

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

# Работа с формами

## Автоматическая обработка форм

Если запрошенный документ содержит форму, вы можете заполнить её поля с помощью метода `set_input()` и отослать методом `submit()`. Значения для полей, которые вы не заполнили явно, будут вычислены автоматически. В первую, очередь это касается hidden-полей, но для select, checkbox, radio полей Grab также попытается подставить какое-либо значение. Все методы работают с формой, которая выбрана по-умолчанию. Если в документе несколько форм, то будет выбрана та форма, в которой больше всего полей. В методах set_input_* автоматический выбор работает несколько по иному, выбирается та форма, которая содержит указанное поле.

Простейший пример поиска на яндексе:

    >>> g = Grab()
    >>> g.go('http://ya.ru')
    <grab.response.Response object at 0x1a51ad0>
    >>> g.set_input('text', 'grab python')
    >>> g.submit()
    <grab.response.Response object at 0x1ad41d0>
    >>> g.xpath('//li[@class="b-serp-item"]//a/@href')
    'http://packages.python.org/grab/'

Форма, выбранная по-умолчанию, доступна через аттрибут form. Это объект lxml.etree.Element с дополнительными свойствами, подробнее вы можете прочитать в lxml мануале.

Если по какой-либо причине вы не можете использовать метод set_input для задания значения элемента по его имени, попробуйте методы: set_input_by_id или универсальный set_input_by_xpath.

Смотрите полный список доступных методов в extensions_form.

## Отправка формы

Как было уже сказано выше, при отправке формы методом submit значения полей, которые в не задали явно, вычисляются автоматически. Это избавляет от рутинной обработки hidden-полей. Также автоматически вычисляется нужные метод HTTP-запроса (POST или GET), нужная кодировка данных (www/url-encoded или multipart/form-data), полный адрес формы (аттрибут action). У метода submit есть несколько полезных аргументов:

- submit_name - позволяет “нажать” нужный вам submit-элементов (полезно, если их несколько)
- make_request - передав False в этом аргументе вы отлючите автоматическую посылку данных формы. Все параметры запроса будут подготовлены в точности, как описано выше, но запрос не будет сгенерирован. Вы можете подправить его параметры по своему вкусу и уже затем отослать его на сервер.
- url - переопределение адреса, куда будет направлен запрос с данными формы
- extra_post - словарь с данными полей, которые переопределят автоматически вычисленные значения.

## Отправка файлов

Для отправки файлов используйте специальный класс `UploadFile`. Его конструктор принимает единственный элемент - путь к файлу. Вы можете использовать объект класса UploadFile в методе `submit()`:

    g.set_input('file', UploadFile('/path/to/file'))
    g.submit()

### Navigation

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