用mechanize填写搜索表单

2 投票
2 回答
2875 浏览
提问于 2025-04-17 14:57

我正在尝试使用mechanize在一个网站上进行搜索(这是我第一次使用这个库,我几乎不懂HTML和浏览器的工作原理)。

我在登录网站时一切正常,但在下一页上填写搜索表单时遇到了问题。

登录时我使用了:

    from mechanize import Browser
    br = Browser()
    br.open(top_url)
    br.select_form(nr=0)
    br["login"] = username
    br["password"] = password
    br.submit()

然后我用循环查看表单的字段名称:

>>> for i in br.forms():
...     print i
...     break
...

这让我得到了以下信息:

<naurp_form POST https://sd.priocom.com/fx/$sd/servlet.ru.naumen.sd.search.SearcherServlet multipart/form-data
  <TextControl(sdsearch_ServiceCallIdSearchType=)>
  <SubmitControl(dosearchsdsearch_ServiceCallIdSearchType=>) (readonly)>
  <HiddenControl(hidden_dosearchsdsearch_ServiceCallIdSearchType=) (readonly)>
  <TextControl(sdsearch_ServiceCallDescriptionSearchType=)>
  <SubmitControl(dosearchsdsearch_ServiceCallDescriptionSearchType=>) (readonly)>
  <HiddenControl(hidden_dosearchsdsearch_ServiceCallDescriptionSearchType=) (readonly)>
  <HiddenControl(searchType__exists=1) (readonly)>
  <SelectControl(searchType=[ClientTitleSearchType, *ClientTitleSearchType, CrmLiteJuridicalClientContactPersonSearchType, CrmLiteByPhoneSearchType, ServiceTitleSearchType, ContractTitleSearchType, CrmLiteNaturalClientSearchType, CrmLiteJuridicalClientSearchType, SDTaskIdSearchType, SDTaskDescriptionSearchType, SDTaskIdSearchType, ServiceCallIdSearchType, ServiceCallCommentSearchType, CoreEmployeeSearchType, CoreOUSearchType, CoreEmployeeSearchType, CoreClientSearchType, CoreContractTitleSearchType, CoreServiceSearchType, KBaseSearchType, CMDBObjectTitleSearchType, CMDBObjectInvNumberSearchType])>
  <TextControl(searchString=)>
  <SubmitControl(doSearch=>) (readonly)>
  <HiddenControl(hidden_doSearch=) (readonly)>
  <HiddenControl(searchUUID=) (readonly)>
  <CheckboxControl(searchInResult=[on])>
  <HiddenControl(searchInResult__exists=1) (readonly)>
  <HiddenControl(backURL=/fx/sd/ru.naumen.sd.published_jsp?uuid=coreboqme50d80000il15pbh3tiac13s) (readonly)>
  <SubmitControl(doClear=╨Ю╤З╨╕╤Б╤В╨╕╤В╤М ╤А╨╡╨╖╤Г╨╗╤М╤В╨░╤В╤Л) (readonly)>
  <HiddenControl(hidden_doClear=) (readonly)>
  <HiddenControl(__form_id=searchTab.searchForm) (readonly)>
  <HiddenControl(first_load=true) (readonly)>>

总共有3个表单(0, 1, 2),这正好和网站上的表单数量一致。

我对第一个表单感兴趣,名字是"sdsearch_ServiceCallIdSearchType"

在实际网站上,它看起来像一个输入框和一个按钮“>>”,显然是dosearchsdsearch_ServiceCallIdSearchType

所以我尝试了这个:

br.select_form(nr = 0)
br['sdsearch_ServiceCallIdSearchType'] = '2770' 
#also tried br.form['sdsearch_ServiceCallIdSearchType'] = '2770'
response = br.submit("dosearchsdsearch_ServiceCallIdSearchType")
tt_page = br.response().read()

更新:我还尝试了.click()方法。

response = br.click(type = 'submit',name = "dosearchsdsearch_ServiceCallIdSearchType")
tt_page = br.response().read()

但是在tt_page中,我仍然收到的是第一个搜索页面(我正在尝试填写搜索表单的页面)。

任何建议都很感激。

附注:我需要的搜索表单的代码(我不知道这是什么意思。我可以猜测,但不能确定我的猜测是否正确):

<!--formbutton.jsp-->
<tr id="sdsearch_ServiceCallIdSearchType_outer" >
    <th style="width:25%;">
        TT number
    </th>
    <td  align="left"
        style="width:100%;vertical-align:middle;">
        <table border="0" cellpadding="0" cellspacing="0"><tr><td style="border:0px">
        <input type="text"
               id="sdsearch_ServiceCallIdSearchType"
               name="sdsearch_ServiceCallIdSearchType"
               size="30"
               value=""
               maxlength="254"               
               style="" 
        />
        </td><td style="border:0px">
<span id="dosearchsdsearch_ServiceCallIdSearchType_outer"
    name="dosearchsdsearch_ServiceCallIdSearchType_outer"
    ><input
        onclick="
                mark_as_pressed(window.event, this);
                "
        style="margin:1px;"    
    type="submit"
    id="dosearchsdsearch_ServiceCallIdSearchType"
    name="dosearchsdsearch_ServiceCallIdSearchType"
    value="&#062;"
/></span>
<input type="hidden" id="hidden_dosearchsdsearch_ServiceCallIdSearchType" name="hidden_dosearchsdsearch_ServiceCallIdSearchType"></td></tr></table></td>
</tr>

附附注:这篇文章很有帮助,还有这个网站上的一些帖子。但没有一个能告诉我为什么在我的情况下它不起作用。

我仍然找不到填写那个表单并进入下一页的方法。

2 个回答

0

罗宾说的方法应该是可行的,不过对于我的表单,我必须使用

br['sdsearch_ServiceCallIdSearchType'] = ['2770']

否则我们基本上是一样的。

0
br.select_form(nr = 0)
br['sdsearch_ServiceCallIdSearchType'] = '2770' 
br.submit()

这个代码应该可以用来提交一个搜索表单!

撰写回答