2010-10-13 21 views
14

Python için yeni ve bu hatayı alıyorum: Bu kod bit üzerindeIndentationError: Beklenmeyen girinti hata

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 

: Hata anlatır gibi

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: "temel blok içindeki her satırın aynı miktarda girintili olması gerekir". ("Temel blok" teriminin yanlış kullanımı, tesadüfen ...) –

+3

"IndentationError" ile nasıl başa çıkılır: 1) Python'un sekme duraklarının her 8 sütun olduğunu düşündüğünün altını çizerek, satırların doğru girintili olduğundan emin olun. 2) Yukarıdaki satırda, genellikle bir 'for', 'if',' else', '' ',' try' ya da benzer bir satır türü olan eksik bir kolon olup olmadığına bakın. Genel olarak, eğer bir satır bir kolonda biterse, kodlu bir sonraki satırın bir miktar girintiye girmesi gerekir. –

+0

Maalesef, düzgün bir şekilde yığın taşmasına yapıştırmadım, kodumla eşleşmesi için şimdi düzeltdim. – ian

cevap

35

StackOverflow sayfasında girinti hataları çok açık olsa da, editörünüzde olmayabilir. Burada, 1, 4 ve 8 boşluklu farklı girinti türlerinin bir karışımı var. Her zaman PEP8'a göre girinti için dört boşluk kullanmalısınız. Ayrıca avoid mixing tabs and spaces da olmalıdır.

Ayrıca, sekmeleri ve boşlukları yanlışlıkla karıştırıp karıştırmayacağınızı belirlemek için betiğinizi '-tt' command-line option kullanarak çalıştırmayı da denemenizi öneririz. Elbette herhangi bir editör, sekmelere karşı boşlukları vurgulayabilecektir (Vim's 'list' option gibi).

+0

Sekmeleri ve boşlukları karıştırmayla ilgili hiçbir sorun yok (Python3, braindamage uygulamasına rağmen, bir hata yaparsa).Bununla birlikte, hiçbir zaman sekme karakterinin genişliğini asla 8 boşluğa ayarlamamalısınız; Bu basitçe^I'nin tanımıdır. –

+1

@Glenn: TAB tanımı 8 boşluk değil, "tabstop'a taşı". Kısmen düzeltiyorsunuz ki, sekmeleri ve boşlukları karıştırmayla ilgili bir sorun yok, ancak yalnızca başka kimse kodunuza bakmayacaksa. Heretik sekme genişliğini kullanan birçok insanla çalışıyorum ve başa çıkmanın tek yolu sadece girinti için boşluk kullanmaktır. –

+0

@Matt: Düz metin dosyasında bir tabstop 8 karakterdir; başka bir şey yanlış. Bu, diğer kodlarla * kod * girmenin, elbette yanlış olduğunu söylemez, fakat bu,^I karakterinin ne anlama geldiğinden tamamen bağımsızdır. Doğru düzeltme, kullanıcıların sekme duraklarını düzeltmelerini söylemektir; bu, sekmeleri devre dışı bırakmaktan daha zor değildir (çoğu düzenleyicide daha kolay). –

3

girinti, yanlıştır. Gördüğünüz gibi, belirtilen çizgiyle başlayan kodun for döngüsünde çok az olduğunu ancak çok fazla for döngüsüyle aynı seviyede olacağını belirtmişsinizdir. Python, for döngüsünü sona erdirerek girinti eksikliğini görür, ardından kodun geri kalan kısmını çok fazla girdiğinizi söyler. (Eminim def hat yığın taşması kodunuzu biçimlendirmek istiyor nasıl sağlanabileceğine dair bir eserdir.)

Düzenleme: sen sekmeler ve boşluklar karışımı var, Eminim senin düzeltme göz önüne alındığında Kaynak dosyası, insan gözüne kod gibi görünüyor, ancak Python bunu dikkate almıyor. Başkalarının önerdiği gibi, sadece boşlukları kullanmak tavsiye edilen uygulamadır (bkz. PEP 8). Python'u python -t ile başlatırsanız, kodunuzda karışık sekmeler ve boşluklar varsa, sorunu belirlemenize yardımcı olacak uyarılar alırsınız.

+0

Her ikisi de aslında yığın taşması nedeniyle, şimdi doğru şekilde görüntüledim. – ian

1

Hata oldukça açık - check_exists_sql ile başlayan satır düzgün girintili değil. Kodunuzdaki bağlamında, ben Girintilemek ediyorum ve şu satırları ondan önce çizgiyi maç için:.

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

Ve tüm yol ve items.append(item) dahil yoluyla for döngü biter (kadar girinti tutmak