【问题标题】:How do I convert web content to a consistant character set when crawling the web?抓取网页时如何将网页内容转换为一致的字符集?
【发布时间】:2012-01-04 05:20:06
【问题描述】:

我对此进行了大量研究和测试。

据我了解,HTTP 标头仅在 Web 服务器设置为这样做时才设置,并且即使开发人员不打算这样做,也可能默认为特定编码。仅当开发人员决定在他们的代码中这样做时才会设置元标头...这也可能由某些开发框架自动设置(如果开发人员没有考虑这一点,这是有问题的)。

我发现,如果设置了这些,它们通常会相互冲突。例如。 HTTP 标头表示页面为iso-8859-1,而元标记指定windows-1252。我可以假设一个取代另一个(可能是元标记),但这似乎相当不可靠。似乎很少有开发人员在处理他们的数据时考虑到这一点,因此动态生成的网站通常会混合编码或使用他们不打算通过来自其数据库的不同编码的编码。

我的结论是做到以下几点:

  1. 使用mb_detect_encoding()检查每个页面的编码。
  2. 如果失败,我使用元编码 (http-equiv="Content-Type"...)。
  3. 如果没有元内容类型,我使用 HTTP 标头 (content_type)。
  4. 如果没有 http 内容类型,我假设 UTF-8。
  5. 最后,我使用 mb_convert_encoding() 转换文档。然后我抓取它的内容。 (我特意省略了要转换的编码,以避免在这里讨论。)

我正在尝试获取尽可能准确的内容,而不是因为开发人员没有正确设置标题而忽略网页。

您认为这种方法有什么问题?

我会在使用 mb_detect_encoding() 和 mb_convert_encoding() 方法时遇到问题吗?

【问题讨论】:

  • UTF-8 端到端或死亡。

标签: php html character-encoding web-scraping


【解决方案1】:

是的,您会遇到问题。 mb_detect_encoding 不是很可靠,请看这些例子:

这会输出bool(false),表示检测失败:

var_dump(mb_detect_encoding(file_get_contents('http://www.pazaruvaj.com/')));

另一个输出string(5) "UTF-8",这显然是一个错误的结果。 HTTP 标头和http-equiv 在本网站上设置正确,它不是有效的 UTF-8:

var_dump(mb_detect_encoding(file_get_contents('http://www.arukereso.hu/')));

我建议您应用所有可用的方法,并利用外部库(例如:http://mikolajj.republika.pl/)并使用最可能的编码。

另一种更精确的方法是建立一个特定国家/地区的可能字符集列表,并仅使用带有mb_convert_encoding 的字符集。就像在匈牙利一样,ISO-8859-2 或 UTF-8 是最有可能的,其他的并不值得考虑。国家可以通过 TLD、Content-Language HTTP 标头和 IP 地址位置的组合来猜测。虽然这需要一些研究工作和额外的开发,但可能值得付出努力。

mb_convert_encoding 文档下的一些 cmets 报告说,iconv 更适合日文字符集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 2017-03-31
    • 1970-01-01
    • 2011-06-08
    • 2019-01-13
    相关资源
    最近更新 更多