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 for
lus 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 for
Loop, klaagt dan dat u de rest van de code te veel hebt ingesprongen. (DE def
LINE 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_sql
is 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_sql
niet 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.