Отправка вложенной формы с помощью python mechanize - PullRequest
1 голос
/ 21 августа 2011

Я пытаюсь отправить форму входа на веб-странице, которая выглядит примерно так. Я также пытался отправить вложенную форму, а также отправить обе формы, одна и та же ошибка каждый раз.

<form method="post" name="loginform">
     <input type='hidden' name='login' value='1'>
     <form action="#" method="post" id="login">
          Username
          <input type="text" name="username" id="username" />
          Password
          <input type="password" name="password" id="password" />
          <input type="submit" value='Login'  class="submit" />

вот мой скрипт на python, который я использую. Я также отметил, что формы не закрываются с </form> Я не уверен, что это как-то связано с моей проблемой.

from mechanize import Browser

br = Browser()

br.set_handle_robots( False )
br.addheaders = [('User-agent', 'Firefox')]

br.open('http://www.example.com/')

br.select_form(name="loginform")

br['login'] = '1'
br['username'] = 'user'
br['password'] = 'pass'

resp = br.submit()

ошибка, которую я получаю

ParseError: nested FORMs

Edit:

import mechanize
from BeautifulSoup import MinimalSoup 

class PrettifyHandler(mechanize.BaseHandler):
    def http_response(self, request, response):
        if not hasattr(response, "seek"):
            response = mechanize.response_seek_wrapper(response)
        # only use BeautifulSoup if response is html
        if response.info().dict.has_key('content-type') and ('html' in response.info().dict['content-type']):
            soup = MinimalSoup (response.get_data())
            response.set_data(soup.prettify())
        return response

br = mechanize.Browser()
br.add_handler(PrettifyHandler())

br.open('http://example.com/')

br.select_form(nr=1)
br.form['username'] = 'mrsmith'
br.form['password'] = '123abc'
resp = br.submit()

print resp.read()

Ответы [ 2 ]

2 голосов
/ 21 августа 2011

Попробуйте использовать ICantBelieveItsBeautifulSoup или анализатор MinimalSoup вместо BeautifulSoup, см. Возможно ли подключить более надежный анализатор HTML к механизации Python? для реализации

1 голос
/ 30 января 2013

Вы можете попробовать найти оскорбительный раздел страницы и настроить его вручную. Например, у меня была страница, на которой возникла проблема с вложенными формами, и я обнаружил, что

<FORM></FORM>

сидит внутри другого блока формы. Мне также нужно было удалить первую строку, потому что она также была плохо отформатирована. Таким образом, вы можете попробовать что-то вроде этого:

...
resp = br.open(url)  # Load login page
# the [111:0] takes away the first 111 chars of the response
# the .replace('<FORM></FORM>','') removes the bad HTML
resp.set_data(resp.get_data()[111:].replace('<FORM></FORM>',''))  
br.set_response(resp)
...