2012-07-25 13 views
5

Sto usando Python 2.7 e Mechanize 2.5. Sto cercando di utilizzare il metodo select_form(), ma sto ottenendo il seguente errore:Python Mechanize select_form() - ParseError: OPTION all'esterno di SELECT

File "C:\Python27\lib\site-packages\mechanize\_mechanize.py", line 499, in select_form 
    global_form = self._factory.global_form 
    File "C:\Python27\lib\site-packages\mechanize\_html.py", line 544, in __getattr__ 
    self.forms() 
    File "C:\Python27\lib\site-packages\mechanize\_html.py", line 557, in forms 
    self._forms_factory.forms()) 
    File "C:\Python27\lib\site-packages\mechanize\_html.py", line 237, in forms 
    _urlunparse=_rfc3986.urlunsplit, 
    File "C:\Python27\lib\site-packages\mechanize\_form.py", line 845, in ParseResponseEx 
    _urlunparse=_urlunparse, 
    File "C:\Python27\lib\site-packages\mechanize\_form.py", line 982, in _ParseFileEx 
    fp.feed(data) 
    File "C:\Python27\lib\site-packages\mechanize\_form.py", line 759, in feed 
    _sgmllib_copy.SGMLParser.feed(self, data) 
    File "C:\Python27\lib\site-packages\mechanize\_sgmllib_copy.py", line 110, in feed 
    self.goahead(0) 
    File "C:\Python27\lib\site-packages\mechanize\_sgmllib_copy.py", line 144, in goahead 
    k = self.parse_starttag(i) 
    File "C:\Python27\lib\site-packages\mechanize\_sgmllib_copy.py", line 302, in parse_starttag 
    self.finish_starttag(tag, attrs) 
    File "C:\Python27\lib\site-packages\mechanize\_sgmllib_copy.py", line 347, in finish_starttag 
    self.handle_starttag(tag, method, attrs) 
    File "C:\Python27\lib\site-packages\mechanize\_sgmllib_copy.py", line 387, in handle_starttag 
    method(attrs) 
    File "C:\Python27\lib\site-packages\mechanize\_form.py", line 736, in do_option 
    _AbstractFormParser._start_option(self, attrs) 
    File "C:\Python27\lib\site-packages\mechanize\_form.py", line 481, in _start_option 
    raise ParseError("OPTION outside of SELECT") 
ParseError: OPTION outside of SELECT 

Questo è il mio codice:

cj = cookielib.LWPCookieJar() 
br = mechanize.Browser() 
br.set_cookiejar(cj) 
br.set_handle_equiv(True) 
br.set_handle_gzip(True) 
br.set_handle_redirect(True) 
br.set_handle_referer(True) 
br.set_handle_robots(False) 
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1) 
br.addheaders = [('User-Agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 
br.open("website_url_which_i_will_not_share") 
br.select_form(nr=0) 

Quello che segue è la sezione di forma del HTML sulla pagina web che ho aperto

<html lang="en-us" xml:lang="en-us" xmlns="http://www.w3.org/1999/xhtml"> 
    <head> I omitted this section </head> 
    <body class="login"> 
     <div id="container"> 
      <div id="header" style="background-color: #13397A;"> 
      <div id="content" class="colM"> 
       <div id="content-main"> 
        <form id="login-form" method="post" action="/admin/"> 
         <div style="display:none"> 
          <input type="hidden" value="8a689f2e3d215a3465f1bb66e037d1a5" name="csrfmiddlewaretoken"> 
         </div> 
         <div class="form-row"> 
          <label class="required" for="id_username">Username:</label> 
          <input id="id_username" type="text" maxlength="30" name="username"> 
         </div> 
         <div class="form-row"> 
          <label class="required" for="id_password">Password:</label> 
          <input id="id_password" type="password" name="password"> 
          <input type="hidden" value="1" name="this_is_the_login_form"> 
          <input type="hidden" value="/admin/" name="next"> 
         </div> 
         <div class="submit-row"> 
          <label>&nbsp;</label> 
          <input type="submit" value="Log in"> 
         </div> 
        </form> 
        <script type="text/javascript"> 
       </div> 
       <br class="clear"> 
      </div> 
      <div id="footer"></div> 
     </div> 
     <script type="text/javascript"> 
    </body> 
</html> 

ho studiato questo su StackOverflow e su google, ma non riesco a trovare una domanda simile o anche una descrizione di questo errore.

Se qualcuno potesse dirmi cosa significa questo errore e aiutarmi a trovare cosa c'è di sbagliato qui, lo apprezzerei molto.

Grazie

Edit: ho fatto un sacco di modulo Sottoporre e ogni sito funziona bene, tranne per questo. Si tratta di un'API di database, di cui sto cercando di eliminare i dati.

+0

Per aiutare, le persone devono essere in grado di riprodurre il problema, senza l'origine di una pagina completa non è realmente possibile. –

+0

Grazie per avermi fatto sapere, ho modificato la mia domanda per includere tutto il codice HTML (escluso il tag head) – camelCase

+0

La fonte che hai ottenuto con un browser web e la richiesta di meccanizzazione dell'origine ottenuta potrebbe essere diversa, per scopi di debug prova a .forms' prima di chiamare select_form. Forse il parser predefinito non può far fronte a un codice HTML non valido ('' dovrebbe essere ''?). –

risposta

2

Ho avuto lo stesso problema (e purtroppo non hanno ancora risolto), e ho trovato questo interessante pezzo di codice, potrebbe aiutare

Da http://comments.gmane.org/gmane.comp.python.wwwsearch.general/1991

import mechanize 
from BeautifulSoup import BeautifulSoup 

class SanitizeHandler(mechanize.BaseHandler): 
    def http_response(self, request, response): 
     if not hasattr(response, "seek"): 
      response = mechanize.response_seek_wrapper(response) 
     #if HTML used get it though a robust Parser like BeautifulSoup 

     if response.info().dict.has_key('content-type') and ('html' in response.info().dict['content-type']): 
      soup = BeautifulSoup(response.get_data()) 
      response.set_data(soup.prettify()) 
     return response 

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

# Now you get good HTML 

Questo dovrebbe ignorare il http_response metodo e "pulisci" il tuo html.

+0

La fonte registrata è morta. Puoi dare ulteriori informazioni sul perché questa è una soluzione? –

Problemi correlati