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

一例ですが、onion-webです。

なぜ 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コマンドによって生成された出力は、 usesと同じエンコーディングでデコード可能であると想定しています。

subprocess.check_output()代わりに試してください。バイトを返します。

于 2013-07-30T22:03:45.130 に答える