2017-05-31 44 views
0

的使用Python 2.7.x和机械化的形式名字,我试图让冰的形式,名称,做一个搜索:获取兵

import mechanize 

AGENT = mechanize.Browser() 
BING = "http://www.bing.com" 

def bing_search(query): 
    AGENT.open(BING) 
    for form in AGENT.forms(): 
     print form 
    AGENT.select_form(name="q") 
    AGENT.form["q"] = query 
    data = AGENT.submit() 

这样做的输出是这样的:

C:\Users\z-perkins-thomas\Documents\bin\python\some-type-of-scanner>python querymine.py 
<GET http://www.bing.com/search application/x-www-form-urlencoded 
    <TextControl(q=)> 
    <SubmitControl(go=) (readonly)> 
    <HiddenControl(qs=ds) (readonly)> 
    <HiddenControl(form=QBLH) (readonly)>> 
Traceback (most recent call last): 
    File "querymine.py", line 4, in <module> 
    bing_search("test") 
    File "C:\Users\z-perkins-thomas\Documents\bin\python\some-type-of-scanner\bin\harvest\search_engines\__init__.py", line 
55, in bing_search 
    AGENT.select_form(name="q") 
    File "C:\Python27\lib\site-packages\mechanize\_mechanize.py", line 524, in select_form 
    raise FormNotFoundError("no form matching "+description) 
mechanize._mechanize.FormNotFoundError: no form matching name 'q' 

C:\Users\z-perkins-thomas\Documents\bin\python\some-type-of-scanner> 

正如您所看到的表单名称已列出,但尝试任何列出的表单名称都不起作用并输出相同的问题,我在这里做了什么错误?

+0

如果你看看你要加载页面的源代码(http://www.bing.com/search),你会看到自己,在那里没有名称为“q”的表单...有一个具有该名称的输入字段,因此您可以选择那个名称。 – errata

+0

@errata BING常数指向'http:// www.bing.com' – user8049647

+0

的确。然而,你的第一行错误表明你最终要求'GET http:// www.bing.com/search'。无论如何,即使在'bing.com'上也没有名称为“q”的表格。 – errata

回答

0

看起来好像你正在尝试选择一个名称为q的表单,该表单在bing.com上不存在。但是,这个名称有一个输入字段。

你应该使用这样的:

def bing_search(query): 
    AGENT.open('http://www.bing.com/') 
    AGENT.select_form(nr=0) 
    AGENT.form['q'] = query 
    data = AGENT.submit() 
+0

我不明白'nr = 0'来自哪里,但是这样做 – user8049647

+0

'nr = 0'将选择页面上的第一个表单。你可以用'id'来选择它,如果你想要的话('form.attrs ['id'] ==='some_form_id'')。 – errata