mechanize._mechanize.FormNotFoundError:没有匹配名称'q'的表单

时间:2013-04-15 16:23:02

标签: python forms web-crawler mechanize

任何人都可以帮我把这个表格选择正确吗?

尝试抓取谷歌,我收到错误: mechanize._mechanize.FormNotFoundError:没有匹配名称'q'

的表单

不寻常,因为我已经看过其他一些使用它的教程,并且: 附:我不打算向SLAM谷歌提出请求,只希望使用自动选择器来不时寻找学术引文pdf。

<f GET http://www.google.com.tw/search application/x-www-form-urlencoded
  <HiddenControl(ie=Big5) (readonly)>
  <HiddenControl(hl=zh-TW) (readonly)>
  <HiddenControl(source=hp) (readonly)>
  <TextControl(q=)>
  <SubmitControl(btnG=Google ?j?M) (readonly)>
  <SubmitControl(btnI=?n???) (readonly)>
  <HiddenControl(gbv=1) (readonly)>>
>>> quit()




import os, subprocess
import re
import mechanize
from bs4 import BeautifulSoup
#prepare mechanize
br = mechanize.Browser()
br.set_handle_robots(False)
br.set_handle_equiv(False)
br.addheaders = [('User-agent', 'Mozilla/5.0')] 
br.open('http://www.google.com/')
br.select_form('q')
citation = ' www.stackoverflow.com '.strip() 
#citation = GOOGLE_BASE + Citation
print citation
br.open('http://www.google.com/')
br.select_form('q')
br.form['q'] = citation
br.submit()
data = br.read()
soup = BeautifulSoup(data)
print soup

1 个答案:

答案 0 :(得分:8)

您正在尝试选择名为q的表单,该表单不存在。似乎表单的名称为f。 (但是,我无法在浏览器中验证 - 即使禁用了Javascript,我也只看到了不同的名称。)

可以像这样进行简单的Google搜索:

import os, subprocess
import re
import mechanize
from bs4 import BeautifulSoup

#prepare mechanize
br = mechanize.Browser()
br.set_handle_robots(False)
br.set_handle_equiv(False)
br.addheaders = [('User-agent', 'Mozilla/5.0')] 
br.open('http://www.google.com/')

# do the query
br.select_form(name='f')   # Note: select the form named 'f' here
br.form['q'] = 'here goes your query' # query
data = br.submit()

# parse and output
soup = BeautifulSoup(data.read())
print soup

这应该会给你一个想法。

更新:如何找到正确的表单'选择器'

要打印可用表单的名称,您可以执行以下操作:

for form in br.forms():
    print form.name

当您使用交互式控制台时,这会派上用场。

您不必使用表单的名称,但您可以提供其他提示以选择正确的表单。例如,在某些页面上,表单根本没有名称。然后,您仍然可以根据表单的编号进行选择,例如br.select_form(nr=1)表示页面上的第二个表单。有关详细信息,请参阅help(br.select_form)。此外,list(br.forms())将为您提供所有表格的清单,您可以进一步检查。

另一个选择是在您的常用浏览器中手动检查页面。