2010-10-13 13 views
14

मैं अजगर करने के लिए नया हूँ और इस त्रुटि हो रही है:IndentationError: अप्रत्याशित मांगपत्र त्रुटि

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

http://docs.python.org/tutorial/introduction.html: "एक बुनियादी ब्लॉक के भीतर प्रत्येक पंक्ति ही राशि के द्वारा इंडेंट जानी चाहिए।" (शब्द "बुनियादी ब्लॉक" का गलत उपयोग करते हैं, संयोग से ...) –

+3

कैसे 'IndentationError' से निपटने के लिए: 1) सुनिश्चित करें कि आपके लाइनों को ठीक से दांतेदार हैं, याद अजगर सोचता है कि उस टैब बंद हो जाता है हर 8 स्तंभ हैं बनाओ। 2) उपरोक्त रेखा पर एक लापता कोलन की तलाश करें, जो आम तौर पर 'के लिए', 'if',' else', 'while',' try', या इसी प्रकार की रेखा होती है। आम तौर पर, यदि एक कोलन में एक रेखा समाप्त होती है, तो कोड के साथ अगली पंक्ति को कुछ राशि से इंडेंट किया जाना चाहिए। –

+0

क्षमा करें, मैंने इसे ठीक से ढेर ओवरफ़्लो में पेस्ट नहीं किया है, मैंने इसे अपने कोड से मेल खाने के लिए अभी तय कर दिया है। – ian

उत्तर

35

जबकि खरोज त्रुटियों StackOverflow पेज में स्पष्ट हैं, वे अपने संपादक में नहीं हो सकता। आपके पास यहां विभिन्न इंडेंटेशन प्रकारों का मिश्रण है, 1, 4 और 8 रिक्त स्थान। PEP8 के अनुसार, आपको हमेशा इंडेंटेशन के लिए चार रिक्त स्थान का उपयोग करना चाहिए। आपको avoid mixing tabs and spaces भी होना चाहिए।

मैं सुझाव है कि आप निर्धारित करने के लिए जब आप गलती से टैब और रिक्त स्थान मिश्रण '-tt' command-line option का उपयोग कर अपने स्क्रिप्ट चलाने के लिए प्रयास करें। बेशक कोई भी सभ्य संपादक टैब बनाम रिक्त स्थान (जैसे Vim's 'list' option) को हाइलाइट करने में सक्षम होगा।

+0

मिश्रण टैब और रिक्त स्थान के साथ कुछ भी गलत नहीं है (यद्यपि पायथन 3, ब्राइंडैमेज के फिट में, यदि आप करते हैं तो एक त्रुटि फेंकता है)।हालांकि, आपको किसी भी टैब चरित्र की चौड़ाई को कभी भी 8 रिक्त स्थान पर सेट नहीं करना चाहिए; यह सिर्फ^I की परिभाषा है। –

+1

@Glenn: टैब की परिभाषा 8 रिक्त स्थान नहीं है, यह "टैबस्टॉप पर ले जाएं"। आप आंशिक रूप से सही हैं कि मिश्रण टैब और रिक्त स्थान के साथ कुछ भी गलत नहीं है, लेकिन केवल तभी होगा जब कोई भी आपके कोड को देखने वाला न हो। मैं बहुत से लोगों के साथ काम करता हूं जो सामयिक टैब चौड़ाई का उपयोग करते हैं, और सामना करने का एकमात्र तरीका इंडेंटेशन के लिए केवल रिक्त स्थान का उपयोग करना है। –

+0

@ मैट: एक सादे पाठ फ़ाइल में एक टैबस्टॉप 8 वर्ण है; कुछ और गलत है। यह कहना नहीं है कि अन्य मात्राओं से इंडेंटिंग * कोड * निश्चित रूप से गलत है, लेकिन यह^I चरित्र का अर्थ है कि पूरी तरह से स्वतंत्र है। सही फिक्स लोगों को अपने टैब स्टॉप को ठीक करने के लिए कहना है, जो टैब को अक्षम करने से अधिक कठिन (आसान, अधिकांश संपादकों में) नहीं है। –

3

खरोज, गलत है के रूप में त्रुटि में बताता है। आप देख सकते हैं, तो आप कोड संकेत लाइन भी for पाश में होना थोड़ा है, लेकिन बहुत ज्यादा पाश के लिए के रूप में एक ही स्तर पर होने की शुरुआत के साथ इंडेंट है। पाइथन for लूप को समाप्त करने के रूप में इंडेंटेशन की कमी को देखता है, फिर शिकायत करता है कि आपने शेष कोड को बहुत अधिक इंडेंट किया है। (def लाइन मैं दांव लगा रहा हूँ बस कैसे स्टैक ओवरफ़्लो अपने कोड फ़ॉर्मेट करने के लिए आप चाहता है की एक विरूपण साक्ष्य है।)

संपादित करें: अपने सुधार को देखते हुए, मैं दांव लगा रहा हूँ आप में टैब और रिक्त स्थान का एक मिश्रण है स्रोत फ़ाइल, जैसे कि यह मानव आंखों को कोड लाइनों की तरह दिखता है, लेकिन पाइथन इसे नहीं मानता है। जैसा कि अन्य ने सुझाव दिया है, केवल रिक्त स्थान का उपयोग करना अनुशंसित अभ्यास है (PEP 8 देखें)। आप python -t साथ अजगर पहुंचने पर आपको चेतावनी अगर वहाँ मिश्रित टैब और अपने कोड में रिक्त स्थान है, जो मदद करनी चाहिए आप इस मुद्दे को ठीक से निर्धारित कर रहे हैं मिल जाएगा।

+0

जहां वास्तव में स्टैक ओवरफ़्लो के कारण होता है, मैंने इसे सही तरीके से प्रदर्शित किया है। – ian

1

त्रुटि बहुत सरल है - 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

त्रुटि कहते हैं आप नहीं सही ढंग से दांतेदार कोड है, check_exists_sql यह cursor = db.cursor() ऊपर लाइन के साथ संरेखित नहीं है।

इसके अलावा खरोज के लिए 4 स्थानों का उपयोग करें।

पढ़ें इस http://diveintopython.net/getting_to_know_python/indenting_code.html

संबंधित मुद्दे