mechanize._mechanize.FormNotFoundError: нет формы, соответствующей имени 'q'

Может ли кто-нибудь помочь мне сделать правильный выбор формы?

При попытке сканирования Google, я получаю сообщение об ошибке: 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.stackru.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 ответ

Решение

Вы пытаетесь выбрать форму с именем 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()) даст вам список всех форм, которые вы можете проверить дальше.

Другой вариант - проверить страницу вручную в обычном браузере.

Другие вопросы по тегам