Отправка формы в Python без атрибута имени - PullRequest
2 голосов
/ 08 мая 2009

Справочная информация:

Используя urllib и urllib2 в Python, вы можете отправить форму.

Сначала вы создаете словарь.

formdictionary = { 'search' : 'stackoverflow' }

Затем вы используете метод urlencode urllib для преобразования этого словаря.

params = urllib.urlencode(formdictionary)

Теперь вы можете сделать URL-запрос с помощью urllib2 и передать переменные params в качестве вторичного параметра, причем первым параметром является url.

open = urllib2.urlopen('www.searchpage.com', params)

Насколько я понимаю, urlencode автоматически кодирует словарь в html и добавляет тег ввода. Ключ принимает атрибут имени. Значение в словаре принимает значение атрибута name. Urllib2 отправляет этот HTML-код через запрос HTTP POST.

Проблема:

Это нормально, если HTML-код, который вы отправляете, отформатирован стандартным способом с вводом html-тега с атрибутом name.

<input id="32324" type="text" name="search" >

Но есть ситуация, когда HTML-код неправильно отформатирован. И тэг html input имеет только атрибут id без атрибута name. Есть ли другой способ доступа к тегу ввода через атрибут id? Или есть еще один способ?

Решение:

Ответы [ 2 ]

2 голосов
/ 08 мая 2009

Согласно стандарту W3 , для поля ввода, которое должно быть отправлено, оно должно иметь атрибут name. Быстрый тест на Firefox 3 и Safari 3.2 показывает, что поле ввода, в котором отсутствует атрибут name, но имеет атрибут id, не отправлено.

С учетом сказанного, если у вас есть форма, которую вы хотите отправить, и некоторые из ее полей имеют атрибуты id, но не атрибуты name, использование атрибута id вместо этого кажется единственно доступным вариантом. Возможно, другие браузеры используют атрибут id, или, возможно, существует некоторый код JavaScript, который обрабатывает событие отправки, а не позволяет браузеру это делать.

0 голосов
/ 08 мая 2009

Входной тег без имени не будет представлен в качестве параметра формы.

Например, создайте страницу HTML, содержащую только это:

<form>
    <input type="text" name="one" value="foo"/>
    <input type="text" value="bar"/>
    <input type="submit"/>
</form>

Вы видите, что во втором текстовом поле отсутствует атрибут name. Если вы нажмете «Отправить», страница обновится строкой запроса:

test.html?one=foo

Хорошей стратегией для этого было бы посмотреть на живой POST-запрос, отправленный вашим браузером, и начать с эмуляции. Используйте такой инструмент, как расширение FireBug для Firefox, чтобы увидеть запрос POST и параметры, отправленные вашим браузером. Там могут быть параметры, которые вы раньше не замечали - возможно, потому что они были скрытыми элементами формы или были созданы / установлены JavaScript.

...