Заполните ввод текста типа и нажмите submit, используя python

У меня есть этот html:

<input type="text" class="txtSearch">
<input type="submit" value="Search" class="sbtSearch">

Мне нужно написать в текстовом поле, а затем нажать кнопку submit, используя python. Входные теги не находятся внутри Форма. Как я мог это сделать?

Ответ 1

Вам не нужно заполнять поля и 'click' submit. Вы можете имитировать представление и получить желаемые результаты.

Используйте BeautifulSoup и urllib вместе с firebug в Firefox. Наблюдайте за сетевым трафиком с firebug и получите параметры post из HTTP POST, которые отправляет dong. Создайте dict и url-encode. Передайте его вместе с запросом вашего URL.

Например:

from BeautifulSoup import BeautifulSoup
import urllib

post_params = {
    param1 : val1,
    param2 : val2,
    param3 : val3
        }
post_args = urllib.urlencode(post_params)

url = 'http://www.website.com/'
fp = urllib.urlopen(url, post_args)
soup = BeautifulSoup(fp)

Параметр vals изменится в соответствии с тем, что вы пытаетесь отправить. Сделайте подходящие номера в своем коде.

Ответ 2

Здесь селеновое решение, если вам действительно нужно заполнить поля. Однако вам, как правило, понадобится только это для тестирования.

from selenium import webdriver

webpage = r"https://www.yourwebsite.com/" # edit me
searchterm = "Hurricane Sandy" # edit me

driver = webdriver.Chrome()
driver.get(webpage)

sbox = driver.find_element_by_class_name("txtSearch")
sbox.send_keys(searchterm)

submit = driver.find_element_by_class_name("sbtSearch")
submit.click()

Ответ 3

ОБНОВЛЕНО 2019 ответ. Этот код также заботится об ошибках HTTP 403 Forbidden.

import urllib.request as urlRequest
import urllib.parse as urlParse

url = "https://yoururl.com"
values = {"name": "value"}

# pretend to be a chrome 47 browser on a windows 10 machine
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36"}

# encode values for the url
params = urlParse.urlencode(values).encode("utf-8")

# create the url
targetUrl = urlRequest.Request(url=url, data=params, headers=headers)

# open the url
x  = urlRequest.urlopen(targetUrl)

# read the response
respone = x.read()
print(respone)

Ответ 4

Мне нравится решение kev, потому что лично мне нравится идея сделать все возможное в urllib, где это возможно.

Тем не менее, ссылаясь на решение КЕВ;

  1. На странице с несколькими текстовыми полями и, возможно, несколькими кнопками, которые могут отправлять данные. Как указать, какое текстовое поле/текстовое поле заполнять?

  2. Точно так же, если на странице есть несколько кнопок, которые будут публиковать данные из определенных текстовых полей, где вы указываете, какой запрос отправлять относительно какой кнопки была бы нажата?