IndentationError: неожиданная ошибка отступа
Я новичок в 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
Ответы
Ответ 1
В то время как ошибки отступа очевидны на странице StackOverflow, они могут быть не в вашем редакторе. Здесь имеется несколько разных типов отступов, 1, 4 и 8 пробелов. Вы должны всегда использовать четыре пробела для отступов, согласно PEP8. Вы также должны избегать микширования вкладок и пробелов.
Я также рекомендую вам попробовать запустить script с помощью параметра командной строки '-tt
, чтобы определить, когда вы случайно смешать вкладки и пробелы. Конечно, любой достойный редактор сможет выделить вкладки в сравнении с пробелами (например, Vim 'list'
вариант).
Ответ 2
Отступ неправильный, как говорит вам ошибка. Как вы можете видеть, вы слишком сильно отшлифовали код, начинающийся с указанной строки, чтобы находиться в цикле for
, но слишком много, чтобы быть на том же уровне, что и цикл for. Python видит отсутствие отступов как завершение цикла for
, а затем жалуется, что вы слишком сильно отшлифовали остальную часть кода. (Строка def
Я ставлю только артефакт о том, как Qaru хочет отформатировать ваш код.)
Изменить: учитывая вашу коррекцию, я уверен, что у вас есть смесь вкладок и пробелов в исходном файле, так что он выглядит как человеческий глаз, как строки кода, но Python считает, что это не так. Как и другие, рекомендуется использовать только пробелы (см. PEP 8). Если вы запустите Python с помощью python -t
, вы получите предупреждения, если в вашем коде есть смешанные вкладки и пробелы, что должно помочь вам определить проблему.
Ответ 3
Ошибка довольно проста - строка, начинающаяся с 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)
).
Ответ 4
По мере того, как ошибка говорит о том, что вы не правильно отшлифовали код, check_exists_sql
не выравнивается с строкой над ней cursor = db.cursor()
.
Также используйте 4 пробела для отступов.
Прочитайте это http://diveintopython.net/getting_to_know_python/indenting_code.html