2016-08-12 12 views
-2

ロシア語のWebサイト(キリル文字)を解析し、データをmySQL DBに挿入しようとしています。解析は正常ですが、キリル文字のためDBにデータを保存できません。 Pythonは私に、このエラーを与える:Python MYSQL 'ascii'コーデックでは、位置10-25の文字をエンコードできません:序数が範囲外(128)

Traceback (most recent call last): 
    File "/Users/kr/PycharmProjects/education_py/vape_map.py", line 40, in <module> 
    print parse_shop_meta() 
    File "/Users/kr/PycharmProjects/education_py/vape_map.py", line 35, in parse_shop_meta 
    VALUES (%s, %s, %s, %s)""",(shop_title, shop_address, shop_phone, shop_site, shop_desc)) 
    File "/Library/Python/2.7/site-packages/MySQLdb/cursors.py", line 210, in execute 
    query = query % args 
TypeError: not all arguments converted during string formatting 

マイコード:

# -- coding: utf-8 -- 
import requests 
from lxml.html import fromstring 
import csv 
import MySQLdb 


db = MySQLdb.connect(host="localhost", user="root", passwd="***", db="vape_map", charset='utf8') 

def get_shop_urls(): 
    i = 1 
    all_shop_urls = [] 
    while i < 2: 
     url = requests.get("http://vapemap.ru/shop/?city=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0&page={}".format(i)) 
     page_html = fromstring(url.content) 
     shop_urls = page_html.xpath('//h3[@class="title"]/a/@href') 
     all_shop_urls += shop_urls 
     i +=1 
    return all_shop_urls 

def parse_shop_meta(): 
    shops_meta = [] 
    csvfile = open('vape_shops.csv', 'wb') 
    writer = csv.writer(csvfile, quotechar='|', quoting=csv.QUOTE_ALL) 
    cursor = db.cursor() 
    for shop in get_shop_urls(): 
     url = requests.get("http://vapemap.ru{}".format(shop), 'utf-8') 
     page_html = fromstring(url.content) 
     shop_title = page_html.xpath('//h1[@class="title"]/text()') 
     shop_address = page_html.xpath('//div[@class="address"]/text()') 
     shop_phone = page_html.xpath('//div[@class="phone"]/a/text()') 
     shop_site = page_html.xpath('//div[@class="site"]/a/text()') 
     shop_desc = page_html.xpath('//div[@class="shop-desc"]/text()') 
     sql = """INSERT INTO vape_shops(title, address, phone, site, description) 
      VALUES (%s, %s, %s, %s)""",(shop_title, shop_address, shop_phone, shop_site, shop_desc) 
     cursor.execute(sql, (shop_title[0], shop_address[0], shop_phone[0], shop_site[0], shop_desc[0])) 
     db.commit() 
    db.close() 
    return shops_meta 

print parse_shop_meta() 
+1

、私はあなたが '' requests'モジュールによって作られたの推測では、実際には良いものであるかどうかを確認するために、あなたの 'GET'要求の後url.encoding'を印刷示唆しています。それ以外の場合は、 'url.encoding = 'あなたのエンコーディングはここで'エンコーディングを変更することができます。また、 'sql'クエリで使用している文字列を試して'デコード 'することもできます。最後に、 'sql'クエリを適切にフォーマットしていますか?あなたはタプルを作成しているようです。 – Abdou

+0

dbに挿入するすべてのものに対して 'unicode(your_string、encoding = 'utf-8'、errors = 'ignore')を試してみてください。 –

+0

アブドゥー、タプルに関するエラーを見た。私のMYSQLのスキルはあまり良くありません。このコードで私を助けることができますか?私は自分のDBにキリル文字を入れてください。 –

答えて

1

%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0Москваのエンコーディングであるので、それはOKになります。しかし、utf8がMySQLとの接続に使用されることを確認する必要もあります。また、ターゲット列がCHARACTER SET utf8であることを指定します。デバッグ目的のために

More detailsPython-specifics

関連する問題