0

同様の投稿で、フォームの値を[on]からnot onに変更することについて質問がありました。これは、単に「True」と「False」の値を設定することでした(Mechanizeを使用)。

これはスクレイプでどのように達成されFormRequest.from_responseますか?

編集
たとえば、mechanizeを使用してフォーム情報を取得する場合、
これはWebページフォームに付属するデフォルトです。
デフォルトでは、フォームのすべてがチェックされます。

<CheckboxControl(ac=[*on])>
type=checkbox, name=ac value=['on']
<CheckboxControl(<None>=[*on])>
type=checkbox, name=None value=[]
<TextControl(p=)>
type=text, name=p value=
<CheckboxControl(pr[]=[*0, *1, *2])>
type=checkbox, name=pr[] value=['0', '1', '2']
<CheckboxControl(a[]=[*0, *1, *2, *3, *4])>
type=checkbox, name=a[] value=['0', '1', '2', '3', '4']
<CheckboxControl(pl=[*on])>
type=checkbox, name=pl value=['on']
<CheckboxControl(sp[]=[*1, *2, *3])>
type=checkbox, name=sp[] value=['1', '2', '3']
<SelectControl(pp=[0, 1, *2, 3])>
type=select, name=pp value=['2']

' ac '、' <None>'および' pl 'に注意してください。
それらの値は[*on]です
。目標はそれらを「オフ」にすることです(?)(チェックを外します)

FormRequest.from_response(response, formnumber=0, formdata={'pr[]': '2', 'sp[]': '3', 'pp': '3', 'a[]': ['3', '4']}))

これにより、formdataごとに変更されたボックスを含むフォームが返されます。formdataに記載されていないキーは引き続きチェックされます。

上記の投稿の例に従ってください:

FormRequest.from_response(response, formdata={'live': 'False'})

'False'、'True'、''、['']、'on'、'off'、および'None'のさまざまな値を使用してFormRequestを実行しましたが、正しい応答が得られないようです。

助言がありますか?

編集:
試みた:

FormRequest(url, formdata = {'pl': 'False'}, callback=parse_this)  
FormRequest(url, formdata = {'pl': 'off'}, callback=parse_this)  
FormRequest(url, formdata = {'pl': ''}, callback=parse_this) 
FormRequest(url, formdata = {'pl': 'None'}, callback=parse_this)
FormRequest(url, formdata = {'pl': None}, callback=parse_this) 

FormRequest.from_response(response, formdata = {'pl': 'False'})  
FormRequest.from_response(response, formdata = {'pl': 'off'})  
FormRequest.from_response(response, formdata = {'pl': '')  

デフォルトでは、Webページはすでにチェックされているチェックボックスを含むフォームを提供します。目標は、フォームを送信し、「オン」/「オフ」の2つのオプションしかないチェックボックスを「オフにする」ことです。

4

1 に答える 1

1

チェックボックスは他のものと同様の入力フィールドです。つまりvalue、サーバーに送信される属性があります。唯一の違いは、チェックされていない場合はまったく送信されず、チェックされている場合は他のフィールドと一緒に送信されることです。つまり、サーバーは通常、その名前がフォームデータに含まれているかどうかを確認するだけで、チェックボックスがオンになっているかどうかを確認します。

「ライブ」というチェックボックスを「オフ」にしたいとします。つまり、サーバーに送信する必要はまったくありません。

FormRequest私は(テストされていませんが、アイデアを得る必要があります)のサブクラスを使用します:

class MyFormRequest(FormRequest):
    """FormRequest subclass which filters from form data submitted to the server None values.
    This allows removing some fields automatically collected from a form by FormRequest.from_response method."""

    def __init__(self, *args, **kwargs):
        formdata = kwargs.get('formdata')
        if formdata: # filter out input fields with None values
            formdata = dict((name, value) for name, value in formdata.iteritems() if value is not None)
            kwargs['formdata'] = formdata

        super(MyFormRequest, self).__init__(*args, **kwargs)

そして、MyFormRequest.from_response代わりに使用しますFormRequest.from_response

問題を解決する別のオプションはFormRequest、手動で構築し、必要なフォームデータのみを使用せずに渡すこと FormRequest.from_responseです。

以下は、チェックされていないチェックボックスで何が起こるかの例です:

PHP スクリプト (checkbox-form.php) では、送信されたオプションを $_POST 配列から取得できます。$_POST['formWheelchair'] が「Yes」の場合、ボックスがチェックされています。チェックボックスがチェックされていない場合、$_POST['formWheelchair'] は設定されません。

于 2012-07-10T04:37:21.487 に答える