2016-02-21 2 views
-1

Я хочу просканировать весь html_code в url и взять их в db MySQL.Ошибка подключения Mysql с scrapy

Но у меня есть ошибка. Ошибка 1054: Неизвестный столбец «$

Я перепробовал много способов, но не могу исправить ошибку. Это заставило меня занять много времени. Я просто изучаю курс лечения. Надеюсь, что все могут помочь мне исправить это. Спасибо

Spider_find.py

from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 
from find.items import WebsiteLoader, FindItem 
from scrapy.loader import ItemLoader 
class FindSpider(BaseSpider): 
    name = "find" 
    allowed_domains = ["tratu.soha.vn"] 
    start_urls = [ 
     "http://tratu.soha.vn/dict/vn_vn/Sang", 
    ] 

    def parse(self, response): 
     item = FindItem() 
     sel = response.xpath('//*') 
     item['html_code'] = sel.xpath('//*').extract()[0] 
     #print item['html_code'] 
     print "CODE HEREEEEEEEEEEEEEEEEEEEEEEEEEEEEe" 
     yield item 

pipelines.py

from datetime import datetime 
import hashlib 
import scrapy 
from scrapy.exceptions import DropItem 
from twisted.enterprise import adbapi 
import sys 
import MySQLdb 

class MySQLStorePipeline(object): 
    host = 'localhost' 
    user = 'root' 
    password = 'success' 
    db = 'find2' 
    def __init__(self): 
     self.conn = MySQLdb.connect(self.host, self.user, self.password, self.db) 
     self.cursor = self.conn.cursor() 

    def process_item(self, item, spider): 
     try: 
      #self.cursor.execute("""INSERT INTO find2.website(html_code) VALUES ({0})""".format((item['html_code'].encode('utf8')))) 
      self.cursor.execute("""INSERT INTO `find2`.`website`(`html_code`) VALUES (`${0}`)""".format((item['html_code'].encode('utf8')))) 
      self.conn.commit() 
     except MySQLdb.Error, e: 
      print "ERRRRRRRRRRRRRRRRRRRRRRRRRRRRRO" 
      print "Error %d: %s" %(e.args[0], e.args[1]) 
     return item 
+2

Это сделало бы этот вопрос гораздо более полезным, когда вы уменьшаете стену код (который полностью не связан с проблемой) с [MVCE] (http://stackoverflow.com/help/mcve) ... – flaschbier

+1

В следующий раз я обращу внимание. Спасибо – Yato

ответ

1

Я предполагаю, что происходит ваша ошибка во время

self.cursor.execute("""INSERT INTO `find2`.`website`(`html_code`) 
    VALUES (`${0}`)""".format((item['html_code'].encode('utf8')))) 

(было бы очень полезно, чтобы включить эту информацию в этом вопросе право далеко ;).

Это потому, что str.format() не использует $ -syntax, но % -syntax. В этом простом случае я хотел бы попробовать

self.cursor.execute("""INSERT INTO `find2`.`website`(`html_code`) 
    VALUES (`%s`)""" % item['html_code'].encode('utf8')) 

Но в целом вы должны никогда код, как это, но всегда использовать синтаксис параметров и применить значение в качестве параметров. В этом случае вы полностью используете , чтобы, потому что вы не знаете, как выглядит HTML-код. И HTML, скорее всего, будет содержать '. Это разрушит синтаксис SQL, который вы создаете по строковой композиции: первый ' в HTML эффективно закроет значение в SQL, давая рейз для плохо сформированного SQL.

Так что синтаксис заполнителем:

self.cursor.execute("""INSERT INTO `find2`.`website`(`html_code`) 
    VALUES (%s)""", (item['html_code'].encode('utf8'),)) 

Давайте посмотрим на следующий вопрос, является ли точка в имени таблицы ...

+0

Я попробовал. Но ошибка не меняется. !!! – Yato

+0

Пожалуйста, перечислите определение таблицы MySQL 'website' (в вопросе) ... – flaschbier

+0

таблица сайта: СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ' find2'.'Website' ( ' 'utf8_unicode_ci' html_code' текстовый символ SET 'utf8' COLLATE NOT NULL, 'id' INT (11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (' id')) ДВИГАТЕЛЬ = InnoDB AUTO_INCREMENT = 2 DEFAULT CHARACTER SET = latin1; – Yato

1

Для форматирования строки в Python я обычно делаю: '{0} {1}'.format('one', 'two').

Итак, попробуйте удалить $ знак из вашего запроса:

self.cursor.execute("""INSERT INTO `find2`.`website`(`html_code`) VALUES (`{0}`)""".format((item['html_code'].encode('utf8')))) 
+0

Я пытаюсь удалить знак «$». Но это все еще ошибка. Ошибка не изменяется. – Yato

Смежные вопросы