在Python / Django

时间:2016-01-19 13:58:20

标签: django python-2.7 unicode encoding lxml

我正在尝试使用lxml解析俄语网站。但是,我遇到了显示俄文字符的问题,我无法克服自己。

我们以这个html片段为例:

<a href="http://www.2do2go.ru/msk/events/41600/kvest-v-realnosti-karty-dengi-dva-stola" class="medium-events-list_link">Квест в реальности «Карты, деньги, два стола»</a>

我正在使用这篇文章解析它:

title = root.xpath('//*[@id="event-id-41600"]/div[3]/div[2]/a/text()')[0].encode('utf-8').strip()

这就是我得到的:

├É┬Ü├É┬▓├É┬Á├Ĺ┬ü├Ĺ┬é ├É┬▓ ├Ĺ┬Ç├É┬Á├É┬░├É┬╗├Ĺ┬î├É┬Ż├É┬ż├Ĺ┬ü├Ĺ┬é├É┬Ş ├é┬ź├É┬Ü├É┬░├Ĺ┬Ç├Ĺ┬é├Ĺ┬ő, ├É┬┤├É┬Á├É┬Ż├Ĺ┬î├É┬│├É┬Ş, ├É┬┤├É┬▓├É┬░ ├Ĺ┬ü├Ĺ┬é├É┬ż├É┬╗├É┬░├é┬╗

在数据库中,而不是西里尔语,我看到:

ÐвеÑÑ Ð² ÑеалÑноÑÑи «ÐаÑÑÑ, денÑги, два ÑÑола»

哦,顺便提一下参考:

这篇文章:

title = item.xpath('div[3]/div[2]/a')[0]
print etree.tostring(title)

给我回复:

<a href="http://www.2do2go.ru/msk/events/41600/kvest-v-realnosti-karty-dengi-dva-stola" class="medium-events-list_link">&#208;&#154;&#208;&#178;&#208;&#181;&#209;&#129;&#209;&#130; &#208;&#178; &#209;&#128;&#208;&#181;&#208;&#176;&#208;&#187;&#209;&#140;&#208;&#189;&#208;&#190;&#209;&#129;&#209;&#130;&#208;&#184; &#194;&#171;&#208;&#154;&#208;&#176;&#209;&#128;&#209;&#130;&#209;&#139;, &#208;&#180;&#208;&#181;&#208;&#189;&#209;&#140;&#208;&#179;&#208;&#184;, &#208;&#180;&#208;&#178;&#208;&#176; &#209;&#129;&#209;&#130;&#208;&#190;&#208;&#187;&#208;&#176;&#194;&#187;</a>

不确定它是否与数据库相关,与python编码有关。任何帮助表示赞赏:)

提前致谢。

编辑:我正在使用MySQL和Django ORM

Django设置:

DATABASE_OPTIONS = {
  "charset": "utf8_general_ci",
  "init_command": "SET storage_engine=INNODB"
}

网页:

<!DOCTYPE html>
<html lang="en" prefix="og: http://ogp.me/ns#" class="">
    <head>
        <title>Интересные события в Москве в январе  - феврале 2016</title>
        <meta charset="utf-8">

1 个答案:

答案 0 :(得分:3)

您的服务器上不存在/未设置西里尔语代码页。所以你甚至不能在UTF-8中查看终端中的俄文字符。但是python stil可以正常使用unicode。

通过此命令:

title = root.xpath('//*[@id="event-id-41600"]/div[3]/div[2]/a/text()')[0].encode('utf-8').strip()

你得到 unicode string 并将其编码为 bytes (str在python2中)。并在数据库中保存字节。

当您从数据库加载字符串时,python使用默认代码页(可能是Latin-1),你得到了这个:

ÐвеÑÑ Ð² ÑеалÑноÑÑи «ÐаÑÑÑ, денÑги, два ÑÑола»

因此,您应该将unicode字符串存储在数据库中(不要使用编码)

title = root.xpath('//*[@id="event-id-41600"]/div[3]/div[2]/a/text()')[0].strip()

P.S。我不明白编码(&#39; Latin-1&#39;)如何帮助(来自评论),但问题已解决:)