【问题标题】:Unable to read Hindi/Devanagari with Python requests / urllib modules无法使用 Python 请求/urllib 模块读取印地语/天城文
【发布时间】:2020-09-21 03:40:09
【问题描述】:

我正在尝试抓取包含印地语数据的 NREGA Website,即梵文脚本。结构很容易刮。但是当我使用 requests/urllib 来获取 html 代码时,印地语文本被转换为一些乱码。文本在网站的代码源中显示良好。

content = requests.get(URL).text

站点中的“1 पी एस”被解析为“1\xe0\xa4\xaa\xe0\xa5\x80\xe0\xa4\x8f\xe0\xa4\xb8”到内容中,当出现乱码时显示为乱码我尝试导出到 csv。

【问题讨论】:

  • 您可以下载网站上给出的excel文件,基本上您可以自动从包含所有数据的网站下载excel文件的过程,而不是自己抓取和保存数据。跨度>
  • @Vin 我需要收集大约 20 万个这样的查询。
  • 是的,这也不是问题。一旦您创建了一个带有您想要下载数据的动态参数的自动化脚本,它将去为您下载该 excel 文件。在您的情况下,我猜测动态值将是 STATE、DISTRICT 和 BLOCK ?
  • 你能告诉我你是如何导航到拉贾斯坦邦页面的吗?
  • @Vin 我在父网站上使用了 selenium 来提取我要抓取的所有 URL

标签: python web-scraping python-requests character-encoding hindi


【解决方案1】:

来自服务器的响应未在其 Content-Type 标头中指定字符集,因此请求 assumes that the page is encoded as ISO-8859-1 (latin-1)。

>>> r = requests.get('https://mnregaweb4.nic.in/netnrega/writereaddata/citizen_out/funddisreport_2701004_eng_1314_.html')
>>> r.encoding
'ISO-8859-1'

事实上,页面被编码为 UTF-8,我们可以通过检查响应的 apparent_encoding 属性来判断:

>>> r.apparent_encoding
'utf-8'

或通过实验:

>>> s = '1 \xe0\xa4\xaa\xe0\xa5\x80 \xe0\xa4\x8f\xe0\xa4\xb8'
>>> s.encode('latin').decode('utf-8')
'1 पी एस'

解码响应的content属性可以得到正确的输出:

>>> html = r.content.decode(r.apparent_encoding)

【讨论】:

  • @RickJames 仅用于证明问题中的 mojibake 是可解码的。
猜你喜欢
  • 2020-04-13
  • 1970-01-01
  • 2014-11-30
  • 2020-10-27
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
相关资源
最近更新 更多