Pythonrequests模块,发布两个“值”来更新和清理websi

2024-10-02 12:33:55 发布

您现在位置:Python中文网/ 问答频道 /正文

第一部分已经回答了,但是EDIT没有

我正在使用python和requests模块来抓取一个网站。因此,我必须“点击”一个更新按钮,这是一个链接(href)包装在一个图像“帕特_更新标记.gif”. 你知道吗

html

<form name="checkout_form" method="POST" id="checkout_form">
    <input type="HIDDEN" id="checkoutpagecmd">
    <a href="#" onclick="return submitCheckout( 'sortByCheckoutDate', 'bycheckoutdate' )"> 
        <img src="/screens/pat_sortbychkout.gif" alt="SORT BY DATE CHECKED OUT" border="0">
    </a>
    <input type="HIDDEN" name="currentsortorder" value="current_duedate">
    <a href="#" onclick="return submitCheckout( 'requestRenewSome', 'requestRenewSome' )">
        <img src="/screens/pat_renewmark.gif" alt="RENEW SELECTED ITEMS" border="0">
    </a>
</form>

javascript(提交)

function submitCheckout(buttonname, buttonvalue)
{
    var oHiddenID;
    oHiddenID = document.getElementById("checkoutpagecmd");

    oHiddenID.name = buttonname;
    oHiddenID.value = buttonvalue;

    //c29364j/c1365070 - prevent the patron from submitting twice
    var oButtonSpan;
    oButtonSpan = document.getElementById("checkoutbuttons0");
    if (oButtonSpan) oButtonSpan.style.display = "none";
    oButtonSpan = document.getElementById("checkoutbuttons1");
    if (oButtonSpan) oButtonSpan.style.display = "none";

    document.getElementById("checkout_form").submit();
    return true;
}

显然submitCheckout传递.namevalue,它们都被分配给”requestRenewSome”’, to the hidden input with theid=“checkoutpagecmd”`。你知道吗


我以前使用过“请求”模块,能够处理简单的用户名和密码输入,例如:

html

<div class="formEntryArea">
    <label for="extpatid">
         <span class="formLabel">
        Your username:
        </span>
    </label>
    <input name="extpatid" id="extpatid" value="" size="20" maxlength="40">
    <label for="extpatpw">
        <span class="formLabel">
        Your password:
        </span>
    </label>
    <input name="extpatpw" id="extpatpw" type="PASSWORD" value="" size="20" maxlength="40">
</div>

python

import requests

with requests.Session() as c:

        LOGIN_URL = "https://example.com"
        USERNAME = “XXXXX”
        PASSWORD = “YYYYY”

        source = c.get(LOGIN_URL)

        data_load = dict(extpatid=USERNAME,extpatpw=PASSWORD)
        head_load = dict(referer=LOGIN_URL)

        c.post(LOGIN_URL, data=data_load, headers=head_load)

然而,这里c.post只处理每个输入的一个“值”(用户名或密码),不包含javascript代码。
似乎,对于上面的问题,我不得不发布两个属性/字符串
.name='请求续订'
.value='requestRenewSome' ? 或者这种方法与我所附的例子完全不同?你知道吗


编辑

马蒂诺的回答(或者t.m.adam的评论)解决了问题!不幸的是,用户必须通过单击“是”按钮来批准他是否确定要续订。你知道吗

html

<form name="checkout_form" method="POST" id="checkout_form">
    <input type="HIDDEN" id="checkoutpagecmd">
    <input type="HIDDEN" name="currentsortorder" value="current_duedate">
    <span id="checkoutbuttons0">
        <input type="SUBMIT" name="renewsome" value="YES">
        <input type="SUBMIT" name="donothing" value="NO">
    </span>
</form>

因此,我将'renewsome': 'YES'添加到data_load字典中,但这还不够。我不知道隐藏输入的值?id=checkoutpagecmd和/或?name=currentsortorder但找不到任何关于如何继续的答案。你知道吗

另外,我知道这是一个已知的问题,如果得到答案,我会把它分开。你知道吗


Tags: nameformidinputvaluetypeloadhidden
1条回答
网友
1楼 · 发布于 2024-10-02 12:33:55

javascript代码实际做的是动态地为隐藏的输入分配名称和值。因此最终可能有两种情况:

<input type="hidden" id="checkoutpagecmd" name="sortByCheckoutDate" value= "bycheckoutdate">

或者

<input type="hidden" id="checkoutpagecmd" name="requestRenewSome" value= "requestRenewSome">

知道了这一点,您可以像这样发送http请求:

requests.post(url, data={'sortByCheckoutDate': 'bycheckoutdate'})  # 1st case
requests.post(url, data={'requestRenewSome': 'requestRenewSome'})  # 2nd case

相关问题 更多 >

    热门问题