0
$ python3 utf8.py                                             
/usr/bin/torsocks /usr/bin/wget -q -O - --user-agent="Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20
100101 Firefox/17.0" http://xiwayy2kn32bo3ko.onion/test/read.cgi/tor/1371355627/978n                
Traceback (most recent call last):
  File "utf8.py", line 13, in <module>
    data = subprocess.getoutput( cmd )
  File "/usr/lib/python3.3/subprocess.py", line 707, in getoutput
    return getstatusoutput(cmd)[1]
  File "/usr/lib/python3.3/subprocess.py", line 683, in getstatusoutput
    text = pipe.read()
  File "/usr/lib/python3.3/codecs.py", line 300, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x83 in position 1674: invalid start byte

我迁移到python3,专门用于解析国际互联网,中文页面等。但我遇到了这个麻烦。

我的简单代码是 wget 周围的 python 包装器,因为它是我认为最简单的避开禁令的方法。

$ cat utf8.py 
#!/usr/bin/python3

import subprocess
from bs4 import BeautifulSoup

url = 'http://xiwayy2kn32bo3ko.onion/test/read.cgi/tor/1371355627/978n'
user_agent = "Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20100101 Firefox/17.0"
wget_cmd = '/usr/bin/wget -q -O - --user-agent="' + user_agent + '" '
torsocks_cmd = '/usr/bin/torsocks '
cmd = torsocks_cmd + wget_cmd + url

print( cmd )
data = subprocess.getoutput( cmd )
print( "Fetch complete" )
print( data )

http://xiwayy2kn32bo3ko.onion/test/read.cgi/tor/1371355627/978n

举个例子,它是洋葱网。

为什么 python3.3 的 codecs.py 不理解所有存在的东西?

子进程崩溃,没有任何机会恢复获取的数据。

是否有通用的国际方法来获取和解析任何语言的 html 页面?我确信 utf-8 是为此任务开发的。

目标页面是:Shift_JIS 编码

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Shift_JIS">

我的主要问题是:应该如何普遍地对任何编码、任何语言进行处理。哪种语言更好地完成这项任务,应该如何解析 html?

我应该使用什么工具来完成这项任务?

4

1 回答 1

3

不要使用subprocess.getoutput(); 它假定命令产生的任何输出都可以使用与sys.stdout使用相同的编码进行解码。

试试subprocess.check_output()吧;它返回字节。

于 2013-07-30T22:03:45.130 回答