IndentationError: error de sangría inesperado

Soy nuevo en Python y recibo este error:

Traceback (most recent call last): File "/usr/local/bin/scrapy", line 4, in  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 

En este bit de código:

 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​ 

Si bien los errores de sangrado son obvios en la página de StackOverflow, es posible que no estén en su editor. Usted tiene una mezcla de diferentes tipos de sangría aquí, 1, 4 y 8 espacios. Siempre debe usar cuatro espacios para la sangría, según PEP8 . También debes evitar mezclar tabulaciones y espacios .

También le recomiendo que intente ejecutar su script utilizando la opción de línea de comandos ‘ -tt ‘ para determinar cuándo mezcla accidentalmente tabulaciones y espacios. Por supuesto, cualquier editor decente podrá resaltar las tabs en lugar de los espacios (como la opción 'list' Vim ).

La sangría es incorrecta, como lo indica el error. Como puede ver, ha sangrado el código que comienza con la línea indicada muy poco para estar en el bucle for , pero demasiado para estar al mismo nivel que el bucle for. Python ve la falta de sangría como el final del bucle for , luego se queja de que has sangrado el rest del código demasiado. (La línea de def que estoy apostando es solo un artefacto de cómo Stack Overflow quiere que usted formatee su código).

Edición: dada su corrección, apuesto a que tiene una mezcla de tabulaciones y espacios en el archivo fuente, de modo que parece al ojo humano que el código se alinea, pero Python considera que no es así. Como han sugerido otros, usar solo espacios es la práctica recomendada (ver PEP 8 ). Si inicia Python con python -t , recibirá advertencias si hay tabs y espacios mixtos en su código, lo que le ayudará a identificar el problema.

El error es bastante sencillo: la línea que comienza con check_exists_sql no está sangrada correctamente. Desde el contexto de su código, lo sangraría y las siguientes líneas para que coincidan con la línea anterior:

  #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) 

Y siga sangrando hasta que finalice el bucle for (hasta el final e incluyendo items.append(item) .

Como el error dice que no has sangrado correctamente el código, check_exists_sql no está alineado con la línea sobre ella cursor = db.cursor() .

También usa 4 espacios para la sangría.

Lea este http://diveintopython.net/getting_to_know_python/indenting_code.html