0

mechanize を使用してフォーム内のアイテムの状態を変更する場合、Python で次のようなリストを作成する必要があります。

['2009', '2008', '2007', '2006', '2005', '2004',]

リストは末尾のコンマで終了する必要があります。そうしないと機能しません。たとえば、次のコードは機能します。

br = mechanize.Browser()
br.select_form(nr=0)
br['ctl03'] = ['2009', '2008', '2007',]

ただし、次のコードは機能しません。

br = mechanize.Browser()
br.select_form(nr=0)
br['ctl03'] = ['2009', '2008', '2007']

これは、末尾のコンマを使用しない場合に表示されるエラー メッセージです。

Traceback (most recent call last):
  File "C:/Users/Renato/PycharmProjects/Agrolink/faostat.py", line 43, in <module>
    br['ctl03$DesktopThreePanes1$ThreePanes$ctl01$TMyears'] = ['2009', '2008', '2007']
  File "C:\Python26\lib\site-packages\mechanize\_form.py", line 2782, in __setitem__
    control.value = value
  File "C:\Python26\lib\site-packages\mechanize\_form.py", line 1977, in __setattr__
    self._set_value(value)
  File "C:\Python26\lib\site-packages\mechanize\_form.py", line 1985, in _set_value
    raise TypeError("ListControl, must set a sequence")
TypeError: ListControl, must set a sequence
Process finished with exit code 1

さて、午後全体にわたってこの問題に対処した後、末尾のコンマなしで必要なことを実行するには、次の方法があることを知りました。

 mylist = ['2009', '2008', '2007']
 br.set_value(mylist, name="ctl03")
4

1 に答える 1

9

これはあまり意味がありません。コンマは、リストを文字列として表すときに挿入される書式設定です。コンマは、リスト自体には値を保持しません。

リストの出力を文字列として変更しますか、それともここで何か他のことをしますか? 追加の「空の」アイテムが必要な場合はNone、たとえば、それをエミュレートするためにリストに追加できます。

そのような余分なコンマでフォーマットされた文字列を作成するには、次のようなことをしたいと思うでしょう:

"["+", ".join(mylist)+",]"

編集の更新:

リストした 2 行は、Python ではまったく同じことを意味します。一方が機能し、もう一方が機能しないということはありません。末尾のコンマは、リスト リテラルの記述を怠けるための構文糖衣です。

>>> ['2009', '2008', '2007',] == ['2009', '2008', '2007']
True

もう一度編集します。

末尾のコンマがコードに影響を与えることは実際には不可能です。バイトコード python を逆アセンブルすると、次のようになります。

import dis

def test1():
    ['2009', '2008', '2007',]

def test2():
    ['2009', '2008', '2007']

dis.dis(test1)
dis.dis(test2)

これにより、次のことがわかります。

  4           0 LOAD_CONST               1 ('2009') 
              3 LOAD_CONST               2 ('2008') 
              6 LOAD_CONST               3 ('2007') 
              9 BUILD_LIST               3 
             12 POP_TOP              
             13 LOAD_CONST               0 (None) 
             16 RETURN_VALUE         
  7           0 LOAD_CONST               1 ('2009') 
              3 LOAD_CONST               2 ('2008') 
              6 LOAD_CONST               3 ('2007') 
              9 BUILD_LIST               3 
             12 POP_TOP              
             13 LOAD_CONST               0 (None) 
             16 RETURN_VALUE    

バイトコードがまったく同じであることがわかります。余分なカンマは、リストの情報として保存されません。これを考えると、これはあなたのコードに影響を与えているものではないと言えるので、再現可能なエラーでテストできるように例を単純化していただければ、問題が実際に何であるかを確認できます.

この動作を再現できません:

test.html:

<form name="test">
<input type="checkbox" name="vehicle" value="Bike" /> I have a bike<br />
<input type="checkbox" name="vehicle" value="Car" /> I have a car
</form> 

その後:

>>> br.open("file:///path/to/test.html")
<response_seek_wrapper at 0x1d74cf8 whose wrapped object = <closeable_response at 0x1f9be60 whose fp = <open file '/path/to/test.html', mode 'rb' at 0x221b9c0>>>
>>> br.select_form(name="test")
>>> br["vehicle"] = ["Bike", "Car",]
>>> br["vehicle"] = ["Bike", "Car"]

どちらの亜種も問題なく動作します。

于 2012-05-03T18:07:37.133 に答える