2010-10-13 16 views
14

Sono nuovo di Python e sto ottenendo questo errore:IndentationError: inaspettato errore trattino

Traceback (most recent call last): 
    File "/usr/local/bin/scrapy", line 4, in <module> 
    execute() 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scrapy/cmdline.py", line 130, in execute 
    _run_print_help(parser, _run_command, cmd, args, opts) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scrapy/cmdline.py", line 96, in _run_print_help 
    func(*a, **kw) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scrapy/cmdline.py", line 136, in _run_command 
    cmd.run(args, opts) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scrapy/commands/crawl.py", line 42, in run 
    q = self.crawler.queue 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scrapy/command.py", line 31, in crawler 
    self._crawler.configure() 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scrapy/crawler.py", line 36, in configure 
    self.spiders = spman_cls.from_settings(self.settings) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scrapy/spidermanager.py", line 33, in from_settings 
    return cls(settings.getlist('SPIDER_MODULES')) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scrapy/spidermanager.py", line 23, in __init__ 
    for module in walk_modules(name): 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scrapy/utils/misc.py", line 65, in walk_modules 
    submod = __import__(fullpath, {}, {}, ['']) 
    File "/my_crawler/empt/empt/spiders/empt_spider.py", line 59 
    check_exists_sql = "SELECT * FROM LINKS WHERE link = '%s' LIMIT 1" % item['link'] 
    ^
IndentationError: unexpected indent 

Su questo pezzo di codice:

def parse_item(self, response): 
    hxs = HtmlXPathSelector(response) 
    sites = hxs.select('//a[contains(@href, ".mp3")]/@href').extract() 
    items = [ ] 

    #for site in sites: 
     #link = site.select('a/@href').extract() 
     #print site 
    for site in sites: 
     item = EmptItem() 
     item['link'] = site #site.select('a/@href').extract() 

     #### DB INSERT ATTEMPT ### 
     #MySQL Test 

     #open db connection 
     db = MySQLdb.connect("localhost","root","str0ng","TESTDB") 

     #prepare a cursor object using cursor() method 
     cursor = db.cursor() 

     #see if any links in the DB match the crawled link 
     check_exists_sql = "SELECT * FROM LINKS WHERE link = '%s' LIMIT 1" % item['link'] 

     cursor.execute(check_exists_sql) 

     if cursor.rowcount = 0: 
      #prepare SQL query to insert a record into the db. 
      sql = "INSERT INTO LINKS (link) VALUES ('%s')" % item['link'] 

      try: 
       #execute the sql command 
       cursor.execute(sql) 
       #commit your changes to the db 
       db.commit() 
      except: 
       #rollback on error 
       db.rollback() 

       #fetch a single row using fetchone() method. 
       #data = cursor.fetchone() 

       #print "Database version: %s " % data 

      #disconnect from server 
      db.close() 

      ### end mysql 

     items.append(item) 
    return items​ 
+1

http://docs.python.org/tutorial/introduction.html: "ogni riga all'interno di un blocco di base deve essere rientrata dello stesso valore". (Uso errato del termine "blocco base", incidentalmente ...) –

+3

Come gestire l'errore "IndentationError": 1) Assicurati che le tue linee siano rientrate correttamente, ricordando che Python pensa che le tabulazioni siano ogni 8 colonne. 2) Cerca i due punti mancanti nella riga sopra, che di solito è un 'for',' if', 'else',' while', 'try', o un tipo simile di linea. In generale, se una riga termina in due punti, la riga successiva con il codice deve essere rientrata di una certa quantità. –

+0

Spiacente, non l'ho incollato correttamente nello stack overflow, l'ho risolto ora per abbinare il mio codice. – ian

risposta

35

Mentre gli errori di indentazione sono evidenti nella pagina StackOverflow, potrebbero non essere nell'editor. Hai un mix di diversi tipi di indentazione qui, 1, 4 e 8 spazi. Dovresti sempre usare quattro spazi per il rientro, come da PEP8. Dovresti anche avoid mixing tabs and spaces.

Inoltre, si consiglia di provare a eseguire lo script utilizzando '-tt' command-line option per determinare quando si mischiano accidentalmente schede e spazi. Ovviamente qualsiasi editor decente sarà in grado di evidenziare le schede rispetto agli spazi (come ad esempio Vim's 'list' option).

+0

Non c'è niente di sbagliato nel mescolare tab e spazi (anche se Python3, in un attacco di braindamage, genera un errore se lo fai).Tuttavia, non si dovrebbe mai, mai e poi mai impostare la larghezza di un carattere di tabulazione su null'altro che 8 spazi; questa è semplicemente la definizione di^I. –

+1

@Glenn: la definizione di TAB non è di 8 spazi, è "sposta al tabstop". In parte hai ragione nel ritenere che non c'è niente di sbagliato nel mescolare tab e spazi, ma solo se nessun altro guarderà il tuo codice. Lavoro con un sacco di persone che usano larghezze di tabulazione eretiche e l'unico modo per farcela è usare solo gli spazi per il rientro. –

+0

@Matt: un tabstop in un file di testo semplice è di 8 caratteri; qualsiasi altra cosa è sbagliata. Ciò non significa che il rientro * del codice * da parte di altri importi sia errato, ovviamente, ma è completamente indipendente da ciò che significa il personaggio^I. La correzione corretta è dire alle persone di correggere i loro punti di tabulazione, che non è più difficile (più facile, nella maggior parte degli editor) che disattivare le schede. –

3

Il rientro è sbagliato, come l'errore che dice. Come puoi vedere, hai indentato il codice iniziando dalla linea indicata troppo poco per essere nel ciclo for, ma troppo per essere allo stesso livello del ciclo for. Python vede la mancanza di indentazione che termina il ciclo for, quindi si lamenta di aver indentato troppo il resto del codice. (La linea def Sto scommettendo è solo un artefatto di come Stack Overflow si vuole formattare il codice.)

Edit: Data la correzione, sto scommettendo si dispone di una miscela di tabulazioni e spazi in il file sorgente, in modo che appaia all'occhio umano come il codice allineato, ma Python lo considera non farlo. Come altri hanno suggerito, l'uso di soli spazi è la pratica raccomandata (vedere PEP 8). Se avvii Python con python -t, riceverai avvisi se ci sono tab e spazi misti nel codice, che dovrebbero aiutarti a individuare il problema.

+0

Sia dove effettivamente causato da overflow dello stack, l'ho reso visualizzato correttamente ora. – ian

1

L'errore è piuttosto semplice: la riga che inizia con check_exists_sql non è rientrata correttamente. Dal contesto del codice, mi trattino e le seguenti righe abbino la linea prima che:.

#open db connection 
    db = MySQLdb.connect("localhost","root","str0ng","TESTDB") 

    #prepare a cursor object using cursor() method 
    cursor = db.cursor() 

    #see if any links in the DB match the crawled link 
    check_exists_sql = "SELECT * FROM LINKS WHERE link = '%s' LIMIT 1" % item['link'] 

    cursor.execute(check_exists_sql) 

e mantenere il rientro fino a quando il ciclo termina for (tutto il percorso attraverso ae includendo items.append(item)

Problemi correlati