【问题标题】:Getting the key and value of br.forms() in Mechanize在 Mechanize 中获取 br.forms() 的 key 和 value
【发布时间】:2016-07-20 13:39:25
【问题描述】:

使用 Mechanize,我可以获取页面的所有表单。

for f in br.forms():
    print f

对于我的页面,它为我提供如下信息:

<HiddenControl(assoc_term_in=201535) (readonly)>
  <HiddenControl(CRN_IN=34688) (readonly)>
  <HiddenControl(start_date_in=03/28/2016) (readonly)>
  <HiddenControl(end_date_in=06/11/2016) (readonly)>
  <HiddenControl(SUBJ=ECEC) (readonly)>
  <HiddenControl(CRSE=451) (readonly)>
  <HiddenControl(SEC=001) (readonly)>
  <HiddenControl(LEVL=Undergraduate Quarter) (readonly)>
  <HiddenControl(CRED=    3.000) (readonly)>
  <HiddenControl(GMOD=Standard Letter) (readonly)>
  <HiddenControl(TITLE=Computer Arithmetic) (readonly)>
  <HiddenControl(MESG=DUMMY) (readonly)>
  <SelectControl(RSTS_IN=[*, WR])>
  <HiddenControl(assoc_term_in=201535) (readonly)>
  <HiddenControl(CRN_IN=31109) (readonly)>
  <HiddenControl(start_date_in=03/28/2016) (readonly)>
  <HiddenControl(end_date_in=06/11/2016) (readonly)>
  <HiddenControl(SUBJ=BIO) (readonly)>
  <HiddenControl(CRSE=141) (readonly)>
  <HiddenControl(SEC=073) (readonly)>
  <HiddenControl(LEVL=Undergraduate Quarter) (readonly)>
  <HiddenControl(CRED=    0.000) (readonly)>
  <HiddenControl(GMOD=Non Gradeable Unit) (readonly)>
  <HiddenControl(TITLE=Essential Biology) (readonly)>
  <HiddenControl(MESG=DUMMY) (readonly)>
  <SelectControl(RSTS_IN=[*, WD])>

但是,我想只打印出f 变量中的值,例如只打印TITLESUBJCRSE

ECEC 451 Computer Arithmetic

我尝试使用f.valuef.valuef['TITLE'],但没有成功。

我之前有这个工作,但是当我删除该注释以将代码提交给版本控制时,我丢失了代码

【问题讨论】:

    标签: python forms mechanize


    【解决方案1】:

    如果你只想要一个特定的值并且你知道关键:

    In [18]: response = br.open("http://www.w3schools.com/html/html_forms.asp")
    
    In [19]: f = list(br.forms())
    
    In [20]: f[0].get_value("firstname")
    Out[20]: 'Mickey'
    In [21]: f[0].get_value("lastname")
    Out[21]: 'Mouse'
    

    您可以使用f._pairs() 访问所有对:

    for f in br.forms():
        print(f._pairs())
    
    response = br.open("http://www.w3schools.com/html/html_forms.asp")
    for f in br.forms():
        print(f)
        print(f._pairs())
    

    您会看到它为您提供键值对:

    <GET http://www.w3schools.com/html/action_page.php application/x-www-form-urlencoded
      <TextControl(firstname=Mickey)>
      <TextControl(lastname=Mouse)>
      <SubmitControl(<None>=Submit) (readonly)>>
    [('firstname', 'Mickey'), ('lastname', 'Mouse')]
    <GET http://www.w3schools.com/html/action_page.php application/x-www-form-urlencoded
      <TextControl(firstname=Mickey)>
      <TextControl(lastname=Mouse)>
      <SubmitControl(<None>=Submit) (readonly)>>
    [('firstname', 'Mickey'), ('lastname', 'Mouse')]
    <GET http://www.w3schools.com/html/html_forms.asp application/x-www-form-urlencoded
      <TextControl(err_email=)>
      <TextControl(err_url=) (disabled)>
      <TextareaControl(err_desc=)>
      <IgnoreControl(<None>=<None>)>>
    [('err_email', ''), ('err_desc', '')]
    

    【讨论】:

    • 谢谢!会试试这个并回复你!
    • 嗨帕德莱克。所以我看到f.pairs() 是一个元组,所以我必须使用索引来访问它们。 for f in br.forms(): for p in f._pairs(): print p[1]。这是目前我访问元组中的值的一种方式,但是,这会打印所有内容。我想指定密钥,所以我将br.forms()f.pairs() 都转换为list(),但出现以下错误:tuple indices must be integers, not str
    • @theGreenCabbage,如果你知道密钥和它的形式,那么在表单上调用 the_form.get_value("key") 将得到你想要的值。
    • 问题是,有多个同名键,因此返回此错误:more than one control matching name 'CRN_IN'。我决定使用双 for 循环来查看是否可以循环通过不同的控件,但没有运气。
    • @theGreenCabbage,你能分享链接吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 2015-11-22
    • 2016-09-17
    • 2015-10-12
    相关资源
    最近更新 更多