0

我在 Windows 7 中使用 python 3.3.0。

我制作了这个脚本来绕过http proxy without authentication系统。但是当我执行时,它给出了错误:UnicodeEncodeError: 'charmap' codec can't encode characters in position 6242-6243: character maps to <undefined> 它似乎无法将 unicode 字符解码为字符串。

那么,我应该使用或编辑/做什么?有人有任何线索或解决方案吗?

我的.py包含以下内容:

import sys, urllib
import urllib.request

url = "http://www.python.org"
proxies = {'http': 'http://199.91.174.6:3128/'}

opener = urllib.request.FancyURLopener(proxies)

try:
    f = urllib.request.urlopen(url)
except urllib.error.HTTPError as  e:
    print ("[!] The connection could not be established.")
    print ("[!] Error code: ",  e.code)
    sys.exit(1)
except urllib.error.URLError as  e:
    print ("[!] The connection could not be established.")
    print ("[!] Reason: ",  e.reason)
    sys.exit(1)

source = f.read()

if "iso-8859-1" in str(source):
    source = source.decode('iso-8859-1')
else:
    source = source.decode('utf-8')

print("\n SOURCE:\n",source)
4

1 回答 1

2
  1. 此代码甚至不使用您的代理
  2. 这种形式的编码检测真的很弱。您应该只在定义明确的位置查找声明的编码:HTTP 标头“Content-Type”以及字符集元标记中的响应是否为 HTML。
  3. 由于您没有包含堆栈跟踪,因此我假设错误发生在该行中 if "iso-8859-1" in str(source):。调用str()使用您的系统默认编码 ( ) 解码字节数据sys.getdefaultencoding()。如果您真的想保留此检查(请参阅第 2 点),您应该这样做 if b"iso-8859-1" in source:这适用于字节而不是字符串,因此无需事先进行解码。

注意:这段代码对我来说很好用,大概是因为我的系统使用了 utf-8 的默认编码,而你的 Windows 系统使用了不同的编码。

更新:我建议在 python 中执行 http 时使用python-requests 。

import requests

proxies = {'http': your_proxy_here}

with requests.Session(proxies=proxies) as sess:
    r = sess.get('http://httpbin.org/ip')
    print(r.apparent_encoding)
    print(r.text)
    # more requests

注意:这不使用 HTML 中指定的编码,您需要像 beautifulsoup 这样的 HTML 解析器来提取它。

于 2013-03-03T18:50:15.567 回答