问题 填写并提交html表单


我正在尝试/想要编写一个Python脚本(2.7),该脚本会转到网站上的表单(名称为 "form1")并用所述单词填写所述表格中的第一个输入字段 hello,第二个带字的输入字段 Ronald,和第三个领域 ronaldG54@gmail.com

任何人都可以帮我编码或给我任何提示或指示如何做到这一点?


8514
2017-10-06 03:29


起源



答案:


除了大卫提到的机械化和硒之外,它也可以实现 Requests 和 BeautifulSoup

为了更清楚,使用 Requests 发送请求和从服务器检索响应,并使用 BeautifulSoup 解析响应html以了解要发送到服务器的参数。

这是我编写的使用两者的示例脚本 Requests 和 BeautifulSoup 提交用户名和密码登录维基百科:

import requests
from bs4 import BeautifulSoup as bs


def get_login_token(raw_resp):
    soup = bs(raw_resp.text, 'lxml')
    token = [n['value'] for n in soup.find_all('input')
             if n['name'] == 'wpLoginToken']
    return token[0]

payload = {
    'wpName': 'my_username',
    'wpPassword': 'my_password',
    'wpLoginAttempt': 'Log in',
    #'wpLoginToken': '',
    }

with requests.session() as s:
    resp = s.get('http://en.wikipedia.org/w/index.php?title=Special:UserLogin')
    payload['wpLoginToken'] = get_login_token(resp)

    response_post = s.post('http://en.wikipedia.org/w/index.php?title=Special:UserLogin&action=submitlogin&type=login',
                           data=payload)
    response = s.get('http://en.wikipedia.org/wiki/Special:Watchlist')

更新:

对于您的具体情况,这是工作代码:

import requests
from bs4 import BeautifulSoup as bs


def get_session_id(raw_resp):
    soup = bs(raw_resp.text, 'lxml')
    token = soup.find_all('input', {'name':'survey_session_id'})[0]['value']
    return token

payload = {
    'f213054909': 'o213118718',  # 21st checkbox
    'f213054910': 'Ronald',  # first input-field
    'f213054911': 'ronaldG54@gmail.com',
    }

url = r'https://app.e2ma.net/app2/survey/39047/213008231/f2e46b57c8/?v=a'

with requests.session() as s:
    resp = s.get(url)
    payload['survey_session_id'] = get_session_id(resp)
    response_post = s.post(url, data=payload)
    print response_post.text

10
2017-10-06 05:48



啊好吧。我可以看到它是如何工作的,但我对如何做一些事情感到困惑。 - IrfanM
您是否介意向我展示如何实现填写表单的以下实例,这样我可以学习如何填写我想要的表单?表格位于 app.e2ma.net/app2/survey/39047/213008231/f2e46b57c8/?v=a - IrfanM
我试图用“survey_form”的id填写表单。然后我想勾选第21个复选框,其ID为“option_213118718”。其次,我想填充第一个输入字段,其id为“field_213054910_input”,名称为“f213054910”,文本为“Ronald”。 - IrfanM
以及id为“field_213054911_input”且名称为“f213054911”的下一个输入字段。我想用文本'ronaldG54@gmail.com'填写,然后提交表格。我真的很感激解决这个问题的所有帮助。 - IrfanM
@IrfanM我已经用工作代码更新了。请记住,它仍然值得学习 Mechanize 和 Selenium 太。 - K Z


答案:


除了大卫提到的机械化和硒之外,它也可以实现 Requests 和 BeautifulSoup

为了更清楚,使用 Requests 发送请求和从服务器检索响应,并使用 BeautifulSoup 解析响应html以了解要发送到服务器的参数。

这是我编写的使用两者的示例脚本 Requests 和 BeautifulSoup 提交用户名和密码登录维基百科:

import requests
from bs4 import BeautifulSoup as bs


def get_login_token(raw_resp):
    soup = bs(raw_resp.text, 'lxml')
    token = [n['value'] for n in soup.find_all('input')
             if n['name'] == 'wpLoginToken']
    return token[0]

payload = {
    'wpName': 'my_username',
    'wpPassword': 'my_password',
    'wpLoginAttempt': 'Log in',
    #'wpLoginToken': '',
    }

with requests.session() as s:
    resp = s.get('http://en.wikipedia.org/w/index.php?title=Special:UserLogin')
    payload['wpLoginToken'] = get_login_token(resp)

    response_post = s.post('http://en.wikipedia.org/w/index.php?title=Special:UserLogin&action=submitlogin&type=login',
                           data=payload)
    response = s.get('http://en.wikipedia.org/wiki/Special:Watchlist')

更新:

对于您的具体情况,这是工作代码:

import requests
from bs4 import BeautifulSoup as bs


def get_session_id(raw_resp):
    soup = bs(raw_resp.text, 'lxml')
    token = soup.find_all('input', {'name':'survey_session_id'})[0]['value']
    return token

payload = {
    'f213054909': 'o213118718',  # 21st checkbox
    'f213054910': 'Ronald',  # first input-field
    'f213054911': 'ronaldG54@gmail.com',
    }

url = r'https://app.e2ma.net/app2/survey/39047/213008231/f2e46b57c8/?v=a'

with requests.session() as s:
    resp = s.get(url)
    payload['survey_session_id'] = get_session_id(resp)
    response_post = s.post(url, data=payload)
    print response_post.text

10
2017-10-06 05:48



啊好吧。我可以看到它是如何工作的,但我对如何做一些事情感到困惑。 - IrfanM
您是否介意向我展示如何实现填写表单的以下实例,这样我可以学习如何填写我想要的表单?表格位于 app.e2ma.net/app2/survey/39047/213008231/f2e46b57c8/?v=a - IrfanM
我试图用“survey_form”的id填写表单。然后我想勾选第21个复选框,其ID为“option_213118718”。其次,我想填充第一个输入字段,其id为“field_213054910_input”,名称为“f213054910”,文本为“Ronald”。 - IrfanM
以及id为“field_213054911_input”且名称为“f213054911”的下一个输入字段。我想用文本'ronaldG54@gmail.com'填写,然后提交表格。我真的很感激解决这个问题的所有帮助。 - IrfanM
@IrfanM我已经用工作代码更新了。请记住,它仍然值得学习 Mechanize 和 Selenium 太。 - K Z


看一眼 机械化 和 。两者都是优秀的软件,可以让您自动填写和提交表单,以及其他浏览器任务。


3
2017-10-06 04:36



我之前听说过Mechanize,但我很担心如何做我想要完成的事情。更具体地说,实际用这些线填写表格。有什么方法可以给你或给我一些基本的代码来开始吗? - IrfanM
Mechanize附带了大量的示例脚本。有一个整体 专门用于表格的部分 这应该可以帮助你开始。 - David Cain
好的,谢谢你指出这一点。 - IrfanM