-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()
、私はあなたが '' requests'モジュールによって作られたの推測では、実際には良いものであるかどうかを確認するために、あなたの 'GET'要求の後url.encoding'を印刷示唆しています。それ以外の場合は、 'url.encoding = 'あなたのエンコーディングはここで'エンコーディングを変更することができます。また、 'sql'クエリで使用している文字列を試して'デコード 'することもできます。最後に、 'sql'クエリを適切にフォーマットしていますか?あなたはタプルを作成しているようです。 – Abdou
dbに挿入するすべてのものに対して 'unicode(your_string、encoding = 'utf-8'、errors = 'ignore')を試してみてください。 –
アブドゥー、タプルに関するエラーを見た。私のMYSQLのスキルはあまり良くありません。このコードで私を助けることができますか?私は自分のDBにキリル文字を入れてください。 –