python - online - indentationerror: unindent does not match any outer indentation level
IndentationError: error de sangrĂa inesperado (4)
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
Soy nuevo en Python y recibo este error:
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
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​
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)
.
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 resto del código demasiado. (La línea de def
que estoy apostando es solo un artefacto de cómo 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 otros han sugerido, usar solo espacios es la práctica recomendada (ver PEP8 ). Si inicia Python con python -t
, recibirá advertencias si hay pestañas y espacios mixtos en su código, lo que le ayudará a identificar el problema.
Si bien los errores de sangrado son obvios en la página de , 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 comando '' -tt
'' para determinar cuándo mezcla accidentalmente tabulaciones y espacios. Por supuesto, cualquier editor decente podrá resaltar las pestañas en lugar de los espacios (como la opción ''list''
Vim ).