使用外国字符抓取网站的问题

时间:2012-06-05 12:10:23

标签: python unicode encoding web-scraping

我正在写一篇关于刮刀的帮助。我正在努力争取大学排名表,其中一些学校是欧洲大学,他们的名字中有外国人(例如ä,ü)。我已经用同样的方式在外国大学的另一个网站上刮另一张桌子了,一切正常。但由于某种原因,当前的刮刀不适用于外来字符(并且就解析外来字符而言,两个刮刀完全相同)。

这是我正在做的尝试&使事情有效:

  1. 在文件的第一行声明编码:

    # -*- coding: utf-8 -*-
    
  2. 导入&使用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')
    
  3. 使用编码功能,如上所述,当使用smart_unicode函数链接时。 我想不出还有什么我可能做错了。在处理这些刮刀之前,我真的不太了解不同的编码,所以这是一个令人大开眼界的经验。我试过阅读以下内容,但仍无法解决这个问题

  4. 据我所知,在编码中,每个字符都分配了一个数字,可以用十六进制,二进制等表示。不同的编码对它们支持的语言数量有不同的容量(例如ASCII只支持英语,UTF-8支持它似乎所有的一切。但是,我觉得我正在做一切必要的事情,以确保正确打印字符。我不知道我的错误在哪里,它让我发疯。 请帮忙!!

3 个答案:

答案 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)?是否有&#19968;(一)或&#233;(é)?

等HTML实体

一旦您猜到/确定了页面的编码,就可以将其转换为UTF-8,然后就可以了。