IndentationError: onverwachte inspringfout

Ik ben nieuw bij Python en krijg deze foutmelding:

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

Op dit stukje code:

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​

Antwoord 1, Autoriteit 100%

Hoewel de inkepingfouten duidelijk zijn in de Stackoverflow-pagina, zijn ze mogelijk niet in uw editor. Je hebt hier een mix van verschillende inspringtypen, 1, 4 en 8 spaties. U moet altijd vier spaties gebruiken voor inkeping, volgens pep8 . Je moet ook vermijd het mengen van tabbladen en ruimtes .

Ik raad u ook aan om uw script te gebruiken met behulp van de -tt‘ Opdrachtregeloptie om te bepalen wanneer u per ongeluk mixt tabbladen en spaties. Natuurlijk kan elke fatsoenlijke editor de tabbladen versus spaties markeren (zoals vim’s 'list'optie ).


Antwoord 2, Autoriteit 10%

De inkeping is verkeerd, omdat de fout je vertelt. Zoals u kunt zien, hebt u de code ingesprongen die begint met de aangegeven lijn te weinig om in de forlus te zijn, maar te veel om op hetzelfde niveau te zijn als de voor lus. Python ziet het gebrek aan inkeping als het beëindigen van de forLoop, klaagt dan dat u de rest van de code te veel hebt ingesprongen. (DE defLINE IK BENT IK WETEN IS ENKEL EEN ARTIFACT VAN HOE STAPE OVERFLOW WILT U JE DE CODE FORMATIE.)

Bewerken:gezien je correctie, wed ik dat je een combinatie van tabs en spaties in het bronbestand hebt, zodat het voor het menselijk oog lijkt alsof de code op een rij staat, maar Python beschouwt het niet. Zoals anderen hebben gesuggereerd, is het aanbevolen om alleen spaties te gebruiken (zie PEP 8). Als je Python start met python -t, krijg je waarschuwingen als er gemengde tabs en spaties in je code staan, wat je zou moeten helpen het probleem te lokaliseren.


Antwoord 3, autoriteit 2%

De fout is vrij eenvoudig – de regel die begint met check_exists_sqlis niet goed ingesprongen. Vanuit de context van je code zou ik deze en de volgende regels laten inspringen om overeen te komen met de regel ervoor:

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

En blijf inspringen totdat de for-lus eindigt (helemaal tot en met items.append(item).


Antwoord 4

Omdat de fout aangeeft dat u de code niet correct hebt ingesprongen, is check_exists_sqlniet uitgelijnd met de regel erboven cursor = db.cursor().

Gebruik ook 4 spaties voor inspringen.

Lees dit http://diveintopython.net/getting_to_know_python/indenting_code.html


Antwoord 5

import urllib.request
import requests
from bs4 import BeautifulSoup
        r = requests.get('https://icons8.com/icons/set/favicon')

Als u verbinding probeert te maken met een dergelijke site, krijgt u een inspringfout.

import urllib.request
import requests
from bs4 import BeautifulSoup
r = requests.get('https://icons8.com/icons/set/favicon')

Python geeft om inspringingen


Antwoord 6

Deze fout treedt op wanneer u blokken niet correct schrijft. Een “:” vergeten, of de “Tab”-knop niet gebruiken voor blokken en spaties gebruiken. Wanneer u een code van de ene editor naar een andere editor transporteert, kan dit gebeuren. En vergeet dit nooit: fouten staan niet altijd op die lijn. Ik kwam hier voor, maar ik ben een uitzondering vergeten na een poging. vanwege mijn niet-standaard editor is het gebeurd. Maar het is mogelijk in de normale editor.

Other episodes