【问题标题】:Python writes strange characters after downloading webpage with mechanizePython用mechanize下载网页后写出奇怪的字符
【发布时间】:2014-06-01 07:26:02
【问题描述】:

我在下载和处理网页时遇到问题。我想做的是:

  • 使用机械化将网页下载到变量中
  • 打印出该网页(在写入文件进行进一步处理之前)
  • 在网页上搜索给定的单词(这将是未来的研究),然后数一数我找到了多少。

我的问题是字符编码,因为我得到了

<title>csonthãᄅjas termãᄅsek - wikipãᄅdia</title>

而不是

<title>csonthéjas termések - wikipédia</title>

几乎每个重音字符和“奇怪”字符都存在问题,例如áűóüő...当我简单地将其写为字符串时,它可以工作。

print 'csonthéjas termések - wikipédia'

Chardet 说它具有 ISO-8859-2 字符编码,但是当我更改脚本编码时没有任何变化。当我尝试将网页编码或解码为任何字符集时,我收到一个错误('invalid continuation byte' 或 'ordinal not in range(128)'

我尝试了许多编码,不同的浏览器代理,使用 chardet 检测编码,然后使用该信息,但没有解决我的问题。我知道这是一个简单的问题,但我找不到正确的答案。我使用 Windows 8.1 和 Python 2.7.6

我的代码如下(我尽量简化):

#!/usr/bin/python
# -*- coding: ISO-8859-2 -*-

def url_get(url_input): #Get the webpage
    "Get the webpage"
    import mechanize
    url = url_input
    br = mechanize.Browser()
    br.set_handle_equiv(True)
    br.set_handle_redirect(True)
    br.set_handle_referer(True)
    br.set_handle_robots(False)
    #User-agent','Mozilla/1.22 (compatible; MSIE 10.0; Windows 3.1)
    br.addheaders = [('user-agent', '   Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3'),
('accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')]
    result = br.open(url).read().lower()
    print result

    import chardet    
    rawdata = result
    detection = chardet.detect(rawdata)
    charenc = detection['encoding']
    print charenc

    return result

text = url_get('http://hu.wikipedia.org/wiki/Csonth%C3%A9jas_term%C3%A9sek')

print 'csonthéjas termések - wikipédia'

【问题讨论】:

  • 您不需要更改脚本文件的编码,您需要对下载的数据进行解码。
  • 谢谢,我以为脚本的编码会影响整个程序而不仅仅是脚本本身。

标签: python python-2.7 character-encoding mechanize-python


【解决方案1】:

页面显示为 UTF-8。带上您的text 并打印text.decode('utf-8')。当我使用 requests 模块阅读页面内容时,这对我有用。

您需要删除 lower() 调用,因为转换为小写可能会损坏 UTF-8 编码的文本。如果要转换为小写,请在解码后调用lower()

当您使用# -*- coding 行时,您可以设置脚本文件的编码。这对脚本文件读取的数据没有影响。处理不同编码的文本数据,需要在读入数据后进行解码。

【讨论】:

  • 我尝试 print text.decode('utf-8') 但我得到 UnicodeDecodeError: 'utf8' codec can't decode bytes in position 108-109: invalid continuation byte 错误。然后我尝试将行更改为result = br.open(url).read().lower().decode('utf-8'),但我遇到了同样的问题。当我尝试一切时,我不小心删除了.lower() 部分,它的效果就像一个奇迹:我到处都能看到正确的字符。我应该将解决方案写到其他地方吗?
  • @KárolySzommer:我没注意到你有lower() 的电话。您需要将其删除,因为文本可能包含不是“真实”字符但只是两字节 UTF-8 编码字符的一部分的大写字符。如果要转换为小写,请在解码后调用lower()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多