[само за програмисти] python 2.5 + MySQLdb 1.2.2 + BeautifulSoup + unicode = УФФ

December 27, 2008

Ако някога имате проблем с Unicode от вида:

self.conn.execute(u”INSERT INTO x(kirilica) VALUES (‘уникод кирилица’)”) #unicode string, won’t work.

Traceback (most recent call last):
File ““, line 71, in
File ““, line 67, in FindTitles
File “/var/lib/python-support/python2.5/MySQLdb/cursors.py”, line 149, in execute
query = query.encode(charset)
UnicodeEncodeError: ‘latin-1’ codec can’t encode characters in position 32-37: ordinal not in range(256)

в условията на абсолютно всичко възможно сетнато на UTF8, конекшън, default encoding etc., да знаете, че това работи:

self.conn.execute(“set names utf8”)
self.conn.execute(“INSERT INTO x(kirilica) VALUES (‘уникод кирилица’)”)
#non-unicode string str. unicode text inside is unreadable, but it will work and mysql will receive correct data. db.charset is set to “utf8”.
#сори за лошия превод

А ако някога решите да се зачудите, защо удобната и бавна библиотека за парсване на HTML BeautifulSoup, която аз ползвам с голям кеф, не ще да работи с cp1251, знайте, че това е решението:

reload(sys); sys.setdefaultencoding(‘utf-8’)

Това решение според менюъла на Python не съществува, то е много лошо, default encoding трябва да е ascii. Да, обаче кодовете ви ще работят повече, ако дефолтния енкодинг е utf8 и въпреки това вашите стрингове по дефолт ще продължат да са ascii, просто защото уникод стрингът u’hello world’ е от съвсем ръзличен тип спрямо стринга str ‘hello world’.

А ако пък имате идея как да накарам “най-добрия парсър във вселената”, universal feedparser, да ми даде данни за съдържащите се embed тагове, направо признавам читателите на блога ми за най-търпеливите на света 😉

Публикувано в: Гърнето с боба 2 коментара RSS 2.0

Ако постът ви харесва, цъкнете на сърцето:

Коментари

2 коментара на “[само за програмисти] python 2.5 + MySQLdb 1.2.2 + BeautifulSoup + unicode = УФФ”

  1. martin on December 29th, 2008 15:19

    защо просто когато използваш unicode не му подаваш като втори аргумент желания енкодинг утф 8 в случая (ако не му го подадеш използва аски по подразбиране 🙂 ) презареждането на sys и модули по принцип не е много добро решение, макар че понякога пести време и нерви.
    иначе шитове от рода на сет неймс и подобни можеш да избегнеш като добавиш в my.cnf
    в раздела, започващ с [mysqld]

    init_connect=’SET collation_connection = utf8_general_ci’
    init_connect=’SET NAMES utf8′
    default-character-set=utf8
    character-set-server=utf8
    collation-server=utf8_general_ci

    тествано на дебиан тестинг.

  2. Стойчо М on December 29th, 2008 16:44

    За последното:
    “Universal Feed Parser does not currently parse microformat content within embedded HTML markup, but it doesn’t destroy it either.”
    http://feedparser.org/docs/html-sanitization.html

Оставете отговор