在python中使用lxml进行网页抓取后,我得到了奇怪的字符而不是土耳其字符 答案为什么

问题描述

我一直在尝试使用lxml lib从某些网站获取数据。和python3。但是在网络抓取过程之后,我得到了一些奇怪的字符,而不是土耳其字符。奇怪的字符如下所示。

  • TürkiyeEngelliler SporYardım veEı(TESYEV)GenelMüdürll¼¼
  • Tek deRSSınavıhakkında duyuru
  • 2019-2020年AKADEMİK YILIGİDENÄİLERÄMİZİN YAPMASI GEREKENİÅ

但是它们应该像下面给出的那样。

  • TürkiyeEngelliler SporYardımveEğitimVakfı(TESYEV)GenelMüdürlüğü
  • Tek deRSSınavıhakkındaduyuru
  • 2019-2020年AKADEMİKYILIGİDENÖĞRENCİLERİMİZİNYAPMASI GEREKENİŞLEMLER

我从不同的网站得到每个句子。我不知道如何将它们转换为土耳其文字

这是我的代码

import cssselect
import requests
from lxml import html

def parse_html(url,selector):
    page = requests.get(url)

    tree = html.fromstring(page.content)
    titles = tree.cssselect(selector)

    for title in titles:
        print(title.text_content().strip())

版本

  • python = 3.7.4
  • lxml = 4.5.2
  • 请求= 2.24.0
  • cssselect = 1.1.0

解决方法

答案

import cssselect
import requests
from lxml import html

def parse_html(url,selector):
    page = requests.get(url)

    content = str(page.content,'utf-8')

    tree = html.fromstring(content)
    titles = tree.cssselect(selector)

    for title in titles:
        print(title.text_content().strip())

为什么

在utf-8中,Unicode字符“ı”(U + 0131)编码为 0xC4B1 。 2个字节。

> echo -e '\u0131' | xxd -u
00000000: C4B1 0A                                  ...

page.content返回一个Binary Response Content

0xC4B1 变为 0xC4 (U + 00C4'Ä')和 0xB1 (U + 00B1'±')

然后 U + 00FC'ü'(UTF-8编码: 0xC3BC )变为 0xC3 (U + 00C3'Ã'), 0xBC (U + 00BC'¼')