IndentationError: неожиданная ошибка отступа - PullRequest
18 голосов
/ 13 октября 2010

Я новичок в Python и получаю эту ошибку:

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

На этот бит кода:

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​

Ответы [ 4 ]

40 голосов
/ 13 октября 2010

Хотя ошибки отступов очевидны на странице StackOverflow, они могут отсутствовать в вашем редакторе. У вас есть смесь различных типов отступов, 1, 4 и 8 пробелов. Вы всегда должны использовать четыре пробела для отступа, согласно PEP8 . Вам также следует избегать смешивания пробелов и пробелов .

Я также рекомендую вам попробовать запустить скрипт, используя параметр командной строки '-tt' , чтобы определить, когда вы случайно смешиваете табуляции и пробелы. Конечно, любой приличный редактор сможет выделить вкладки и пробелы (например, опция Vim's 'list' ).

3 голосов
/ 13 октября 2010

Отступ неверен, как говорит ошибка. Как видите, вы отступили в коде, начинающемся с указанной строки, слишком мало, чтобы быть в цикле for, но слишком много, чтобы быть на том же уровне, что и цикл for. Python считает отсутствие отступов завершением цикла for, а затем жалуется, что вы слишком много отступили от остальной части кода. (Линия def, на которую я держу пари, является всего лишь артефактом того, как Stack Overflow хочет, чтобы вы отформатировали свой код.)

Редактировать: С учетом вашего исправления, держу пари, у вас есть исходные файлы в виде комбинации табуляций и пробелов, так что он выглядит для человеческого глаза, как код, выстроенный в линию, но Python считает это не для Как предлагали другие, рекомендуется использовать только пробелы (см. PEP 8 ). Если вы запустите Python с python -t, вы получите предупреждения, если в вашем коде есть смешанные табуляции и пробелы, которые должны помочь вам точно определить проблему.

1 голос
/ 13 октября 2010

Ошибка довольно проста - строка, начинающаяся с check_exists_sql, не имеет правильного отступа.Исходя из контекста вашего кода, я бы сделал отступ и следующие строки, чтобы соответствовать строке перед ним:

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

И продолжал делать отступы до конца цикла forв том числе items.append(item).

0 голосов
/ 13 октября 2010

Поскольку в сообщении об ошибке указано, что у вас неверный код, check_exists_sql не выравнивается над строкой над ним cursor = db.cursor().

Также используйте 4 пробела для отступа.

Читать это http://diveintopython.net/getting_to_know_python/indenting_code.html

...