我正在写一篇关于刮刀的帮助。我正在努力争取大学排名表,其中一些学校是欧洲大学,他们的名字中有外国人(例如ä,ü)。我已经用同样的方式在外国大学的另一个网站上刮另一张桌子了,一切正常。但由于某种原因,当前的刮刀不适用于外来字符(并且就解析外来字符而言,两个刮刀完全相同)。
这是我正在做的尝试&使事情有效:
在文件的第一行声明编码:
# -*- coding: utf-8 -*-
导入&使用django框架中的智能unicode从django.utils.encoding导入smart_unicode
school_name = smart_unicode(html_elements[2].text_content(), encoding='utf-8',
strings_only=False, errors='strict').encode('utf-8')
使用编码功能,如上所述,当使用smart_unicode函数链接时。 我想不出还有什么我可能做错了。在处理这些刮刀之前,我真的不太了解不同的编码,所以这是一个令人大开眼界的经验。我试过阅读以下内容,但仍无法解决这个问题
据我所知,在编码中,每个字符都分配了一个数字,可以用十六进制,二进制等表示。不同的编码对它们支持的语言数量有不同的容量(例如ASCII只支持英语,UTF-8支持它似乎所有的一切。但是,我觉得我正在做一切必要的事情,以确保正确打印字符。我不知道我的错误在哪里,它让我发疯。 请帮忙!!
答案 0 :(得分:2)
从网页中提取信息时,您需要确定其字符编码,类似于浏览器执行此类操作的方式(分析HTTP标头,解析HTML以查找meta
标记,以及可能根据实际数据进行猜测,例如在某些编码中存在看起来像BOM的东西)。希望您能找到一个为您完成此任务的库例程。
在任何情况下,您都不应期望所有网站都是utf-8编码的。 Iso-8859-1仍然被广泛使用,并且通常读取iso-8859-1,好像它是utf-8导致一个大混乱(对于任何非Ascii字符)。
答案 1 :(得分:0)
如果您使用的是requests library,它会根据HTTP标头自动解码内容。获取页面的HTML内容非常简单:
>>> import requests
>>> r = requests.get('https://github.com/timeline.json')
>>> r.text
'[{"repository":{"open_issues":0,"url":"https://github.com/...
答案 2 :(得分:-1)
首先需要查看文档的<head>
部分,看看是否有charset
信息:
<meta http-equiv="Content-Type" content="text/html; charset=xxxxx">
(注意StackOverflow,这个页面,没有任何字符集信息......我想知道中文字
,我输入的假设它是UTF-8,将在中国的PeeCees上显示最多可能设置为GBK,或日语pasokon
仍然坚定地在Shift-JIS土地上。)
因此,如果你有一个字符集,你知道会发生什么,并相应地处理它。如果没有,你将不得不做一些有根据的猜测 - 在页面的纯文本版本中是否有非ASCII字符(&gt; 127)?是否有一
(一)或é
(é)?
一旦您猜到/确定了页面的编码,就可以将其转换为UTF-8,然后就可以了。