2010-10-13 21 views
14

Soy nuevo en Python y estoy recibiendo este error:IndentationError: error inesperado del guión

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 fragmento 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​ 
+1

http://docs.python.org/tutorial/introduction.html: "cada línea dentro de un bloque básico debe sangrarse por la misma cantidad". (Uso incorrecto del término "bloque básico", por cierto ...) –

+3

Cómo lidiar con 'IndentationError': 1) Asegúrese de que sus líneas estén sangradas correctamente, recordando que Python cree que las tabulaciones son cada 8 columnas. 2) Busque los dos puntos que faltan en la línea superior, que suele ser un 'for',' if', 'else',' while', 'try' o un tipo de línea similar. En general, si una línea termina en dos puntos, la siguiente línea con código debe sangrarse en cierta cantidad. –

+0

Lo siento, no pegué esto correctamente en el desbordamiento de la pila, lo he arreglado ahora para que coincida con mi código. – ian

Respuesta

35

Si bien los errores de sangría 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 sangría, según PEP8. También debe avoid mixing tabs and spaces.

También recomiendo que intente ejecutar su secuencia de comandos usando el '-tt' command-line option para determinar cuándo mezcla accidentalmente pestañas y espacios. Por supuesto, cualquier editor decente podrá resaltar pestañas frente a espacios (como Vim's 'list' option).

+0

No hay nada de malo en mezclar pestañas y espacios (aunque Python3, en un ataque de daño cerebral, arroja un error si lo haces).Sin embargo, nunca debe establecer el ancho de un carácter de tabulación a nada excepto 8 espacios; esa es simplemente la definición de^I. –

+1

@Glenn: la definición de TAB no es 8 espacios, es "mover a la pestaña". En parte, tienes razón en que no hay nada de malo en mezclar pestañas y espacios, pero solo si nadie más va a mirar tu código. Trabajo con muchas personas que usan anchos heréticos de pestañas, y la única manera de sobrellevarlo es usar solo espacios para la sangría. –

+0

@Matt: una tabstop en un archivo de texto plano tiene 8 caracteres; cualquier otra cosa está mal. Eso no quiere decir que sangrar * código * por otras cantidades es incorrecto, por supuesto, pero eso es completamente independiente de lo que significa el carácter^I. La solución correcta es decirle a las personas que arreglen sus tabulaciones, que no es más difícil (más fácil, en la mayoría de los editores) que deshabilitar las pestañas. –

3

El sangrado es incorrecto, ya que el error le indica. 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 en el mismo nivel que el bucle for. Python considera que la falta de sangría es la terminación del ciclo for, luego se queja de que ha sangrado demasiado el resto del código. (La línea def apuesto es sólo un artefacto de cómo desbordamiento de pila que quiere dar formato a su código.)

Editar: Dada su corrección, apuesto que tiene una mezcla de tabuladores y espacios en el archivo de origen, de modo que se ve al ojo humano como las líneas de código, pero Python considera que no. Como otros han sugerido, el uso de espacios únicos es la práctica recomendada (ver PEP 8). Si inicia Python con python -t, recibirá advertencias si hay pestañas y espacios mixtos en su código, lo que debería ayudarlo a identificar el problema.

+0

Ambos, en realidad, causados ​​por el desbordamiento de la pila, lo he hecho mostrar correctamente ahora. – ian

1

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, me sangrarlo y las siguientes líneas para unir la línea antes de que:.

#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 tenga sangría hasta que los extremos de bucle (for todo el camino a través de e incluyendo items.append(item)

Cuestiones relacionadas