2012-07-09 57 views
0

在類似的post問一個關於將表單值從[開]改爲不開的問題,這個問題只是設置了'True'和'False'的值使用機械化)。scrapy FormRequest True/False on /'off'Checked Boxes

這將如何在scrapy FormRequest.from_response中完成?

編輯
例如,使用機械化獲取形式信息,
這是自帶的網頁形式的默認。
默認情況下,在表格上的一切檢查:

<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'] 

注意 '交流', '<None>' 和 'PL'。
他們有[*上]的值
的目標是將其「關閉」(?)(取消他們)

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'}) 

我也做了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': '') 

默認情況下,該網頁提供了包含已選中的複選框的形式。目標是提交表單和'關閉'一些複選框,只有兩個選項:'開'/'關'

+0

是不是一個複選框發送''字符串''或'字符串'關''? – 2012-07-10 14:00:47

+0

@Sjaak Trekhaak:這就是我的想法,但FormRequest.from_response一直拋出一個錯誤。 – user1460015 2012-07-10 19:44:18

回答

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

Here就是一個例子什麼用其中的複選框選中有發生:

在PHP腳本(複選框-form.php的),我們可以從$ _POST數組提交的選項 。如果$ _POST ['formWheelchair']是「是」,則檢查框 。如果未選中複選框,則不會設置 $ _POST ['formWheelchair']。

+0

如果默認選中某些複選框,該怎麼辦?因此,當您加載網頁時,表單會提供複選框(默認情況下,框已被選中)。目標是重新提交表單,其中一些框已勾選,而其他框未勾選。 – user1460015 2012-07-10 19:42:08

+0

然後像'MyFormRequest.from_response(response,formname ='form',formdata = {'live':None})這樣的smith應該可以工作。 'formdata'中帶有'None'值的鍵將從發送到服務器的表單數據中排除。 – warvariuc 2012-07-11 03:57:00

+0

查看我的編輯。 Thx – user1460015 2012-07-11 15:39:54