Skip to main content
 首页 » 编程设计

python之Mechanize ._mechanize.FormNotFoundError : no form matching name 'q'

2025年05月04日11落叶

谁能帮我正确选择这个表单?

试图抓取 google,我得到错误: mechanize._mechanize.FormNotFoundError: 没有匹配名称 'q' 的表单

不寻常,因为我看过其他几个使用它的教程,并且: 附:我不打算通过请求 SLAM google,只是希望使用自动选择器来不时地查找学术引文 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 

请您参考如下方法:

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

一个简单的谷歌搜索可以像这样完成:

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()) 将为您提供您可以进一步检查的所有表单的列表。

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