2

私は次のスクリプトをいじくり回しています。

#    -*- coding: utf8 -*-
import codecs
from BeautifulSoup import BeautifulSoup, NavigableString,
UnicodeDammit
import urllib2,sys
import time
try:
    import timeoutsocket # http://www.timo-tasi.org/python/timeoutsocket.py
    timeoutsocket.setDefaultSocketTimeout(10)
except ImportError:
    pass

h=u'\u3000\u3000\u4fe1\u606f\u901a\u4fe1\u6280\u672f'

address=urllib2.urlopen('http://stock.eastmoney.com/news/1408,20101022101395594.html').read()
soup=BeautifulSoup(address)

p=soup.findAll('p')
t=p[2].string[:10]

次の出力で:

印刷t

¡¡¡¡ÐÅϢͨ

印刷h

  信息通</p>

t

u'\ xa1 \ xa1 \ xa1 \ xa1 \ xd0 \ xc5 \ xcf \ xa2 \ xcd \ xa8'

h

u'\ u3000 \ u3000 \ u4fe1 \ u606f \ u901a'

h.encode('gbk')

'\ xa1 \ xa1 \ xa1 \ xa1 \ xd0 \ xc5 \ xcf \ xa2 \ xcd \ xa8'

簡単に言えば、このhtmlをBeautifulSoupに渡すと、gbkでエンコードされたテキストを受け取り、最初にデコードする必要があることを認識せずに、Unicodeであると見なします。「h」と「t」は同じである必要がありますが、hは私がhtmlファイルからテキストを取得して手動で変換するだけなのでです。

この問題を解決するにはどうすればよいですか?

一番

ウィートン

4

1 に答える 1

5

ファイルのメタタグは、文字セットがGB2312であると主張していますが、データには新しいGBK / GB18030の文字が含まれており、これがBeautifulSoupをトリップさせています。

simon @ lucifer:〜$ python
Python 2.7(r27:82508、2010年7月3日、21:12:11)
[GCC 4.0.1(Apple Inc.ビルド5493)]ダーウィン
詳細については、「help」、「copyright」、「credits」、または「license」と入力してください。
>>>インポートurllib2
>>>データ=urllib2.urlopen('http://stock.eastmoney.com/news/1408,20101022101395594.html')。read()
>>> data.decode( "gb2312")
トレースバック(最後の最後の呼び出し):
  ファイル""、1行目、
UnicodeDecodeError:'gb2312'コーデックは位置20148-20149のバイトをデコードできません:不正なマルチバイトシーケンス

この時点で、UnicodeDammitはベイルアウトし、chardetUTF-8、そして最後にWindows-1252を試します。これは常に成功します。これは、見た目ではこれが得られたものです。

認識されない文字を「?」に置き換えるようにデコーダーに指示すると、GB2312で欠落している文字を確認できます。

>>>データの印刷[20140:20160] .decode( "gb2312"、 "replace")
毒尾ガス二�英的排放难

正しいエンコーディングの使用:

>>>データの印刷[20140:20160] .decode( "gb18030"、 "replace")
毒尾ガス二噁英的排放难
>>>BeautifulSoupからインポートBeautifulSoup
>>> s = BeautifulSoup(data、fromEncoding = "gb18030")
>>> print s.findAll( "p")[2] .string [:10]
  信息通信技|是&

また:

>>> print s.findAll( "p")[2] .string
  信息通信技
力、增速远高在GDP。软件外包、服务外包、管理软件、车ダウンロードゲーム、0042上购物、0042络游戏、
移PIN办公、移PINر络游戏、0042络视频等結合很强的評価提供求、使信息技
高增NL。
于 2010-11-04T00:03:16.563 に答える