2013-04-15 67 views
1

任何人都可以幫助我得到此表單選擇正確嗎?mechanize._mechanize.FormNotFoundError:無表單匹配名稱'q'

試圖讓谷歌的抓取,我得到的錯誤: mechanize._mechanize.FormNotFoundError:沒有形成匹配的名字「Q」

不尋常的,因爲我一直在使用它看到其他幾個教程和: PS我不打算用請求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 

回答

6

您正在嘗試選擇名爲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())會爲您提供您可以進一步檢查的所有表單的列表。

另一種選擇是在平常的瀏覽器中手動檢查頁面。

+0

在未來,如果谷歌要改變表單的名稱,或者像這樣的其他網站你能讓我知道如何獲得表單名稱? –

+0

當然,請參閱最新的答案。 – cyroxx