python自动填充表单在网页中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python自动填充表单在网页中相关的知识,希望对你有一定的参考价值。

我试图在一个网页中填写一个表单,该表单有一个文本框和一个发送按钮,html看起来像这样

<form class="form-horizontal">
                        <div class="row">
                            <div class="col-md-12">
                                <div id="TextContainer" class="textarea-container">
                                    <textarea id="Text" rows="5" maxlength="700" class="form-control remove-border" style="background:none;"></textarea>
                                </div><button id="Send" class="btn btn-primary-outline" type="button" onclick="SendMessage()" style="margin-top:10px" data-loading-text="Loading..."><span class="icon icon-pencil"></span> Send</button>
                            </div>
                        </div>
                    </form>

我尝试使用mechanize来提交带有此代码的表单

import re
from mechanize import Browser

br = Browser()
response=br.open("https://abcd.com/")
for f in br.forms():
    if f.attrs['class'] == 'form-horizontal':
        br.form = f
text = br.form.find_control(id="Text")
text.value = "something"
br.submit()

代码运行没有错误,但没有提交,我该怎么做?

这是SendMessage函数

function SendMessage() {
    var text = $('#Text').val();
    var userId = $('#RecipientId').val();
    if (text.trim() === "")
    {
        $('#TextContainer').css('border-color', 'red');
    }
    else if (new RegExp("([a-zA-Z0-9]+://)?([a-zA-Z0-9_]+:[a-zA-Z0-9_]+@)?([a-zA-Z0-9.-]+\.[A-Za-z]{2,4})(:[0-9]+)?(/.*)?").test(text))
    {
        $('#TextContainer').css('border-color', 'red');
        $('#message').html("Links are not allowed in messages");
    }
    else
    {
        $('#Send').button('loading');
        $.ajax(
        {
            url: '/Messages/SendMessage',
            type: 'POST',
            cache: false,
            data:
            {
                __RequestVerificationToken: $('<input name="__RequestVerificationToken" type="hidden" value="CfDJ8MQSRebrM95Pv2f7WNJmKQWGnVR66zie_VVqFsquOCZLDuYRRBPP1yzk_755VDntlD3u0L3P-YYR0-Aqqh1qIjd09HrBg8GNiN_AU48MMlrOtUKDyJyYCJrD918coQPG0dmgkLR3W85gV6P4zObdEMw" />').attr('value'),
                userId: userId,
                text: text
            }

        });
    }

}
答案

我怀疑问题是HTML表单中的提交按钮不是type=submit - 所以当你调用br.submit()时,机械师不知道该怎么做。修复方法是更改​​HTML网站上的按钮类型,或告诉浏览器使用哪个按钮来提交表单:

br.submit(type='button', id='Send')

submit方法采用与HTML Forms API相同的参数,因此我建议您查看documentation以获取更多详细信息。

更新

这里的问题似乎是附加到按钮的JavaScript方法。 Mechanize不支持调用JavaScript函数,因此您将无法使用.submit()方法提交表单。相反,最好的选择可能是阅读SendMessage() JavaScript函数,如果有人单击Send按钮,则会调用该函数,并手动将其转换为Python。在最好的情况下,它包含一个简单的AJAX POST请求,在Python中很容易实现。请look here提出相关问题。

第二次更新

鉴于您的问题中的新信息,特别是JavaScript函数,您现在可以在Python脚本中手动实现POST请求。我建议使用Requests模块,这将使实现更容易。

import requests

data = {
    "__RequestVerificationToken": "CfDJ8MQSRebrM95Pv2f7WNJmKQWGnVR66zie_VVqFsquOCZLDuYRRBPP1yzk_755VDntlD3u0L3P-YYR0-Aqqh1qIjd09HrBg8GNiN_AU48MMlrOtUKDyJyYCJrD918coQPG0dmgkLR3W85gV6P4zObdEMw",
    "userId": "something",
    "text": "something else"
}

response = requests.post("https://example.com/Messages/SendMessage", data=data)

response现在将包含您可以用来检查请求是否成功的响应。请注意,您可能需要通过机械化读出__RequestVerificationToken,因为我怀疑每次打开网站时都会生成它。您可以使用html_source = br.read()读出HTML源代码,然后搜索__RequestVerificationToken并尝试提取相应的值。

另一答案

您可以为文本区域指定name属性,如:

<form class="form-horizontal">
                        <div class="row">
                            <div class="col-md-12">
                                <div id="TextContainer" class="textarea-container">
                                    <textarea id="Text" name="sometext" rows="5" maxlength="700" class="form-control remove-border" style="background:none;"></textarea>
                                </div><button id="Send" class="btn btn-primary-outline" type="button" onclick="SendMessage()" style="margin-top:10px" data-loading-text="Loading..."><span class="icon icon-pencil"></span> Send</button>
                            </div>
                        </div>
                    </form>

试试这个:

import re
from mechanize import Browser

br = mechanize.Browser()
br.open("https://abcd.com/")
br.select_form(nr=0) #in case of just single form you can select form passing nr=0
br["sometext"] = "something"
response  = br.submit()
print(response.read())

如果它成功提交表单,那么您可以阅读您的回复正文。

以上是关于python自动填充表单在网页中的主要内容,如果未能解决你的问题,请参考以下文章

jquery 防止自动填充表单

如何通过单击适配器类中代码的项目中的删除按钮来删除列表视图中的项目后重新加载片段?

如何在外部网页上自动填充表单数据?

网页禁用表单的自动完成功能禁用密码自动填充autocomplete

Chrome浏览器无法自动填充表单

Flask 编写http接口api及接口自动化测试