Python – BeautifulSoup html parsing manejo gbk encoding mal – problema de webscraping chino

He estado jugando con el siguiente script:

# -*- 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] 

Con la siguiente salida:

imprimir t

¡¡¡¡ÐÅÏ ¢ ͨ

imprimir h

信息 通

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’

En pocas palabras: cuando paso este html a través de BeautifulSoup, toma el texto codificado en gbk y piensa que es unicode, sin reconocer que se debe decodificar primero. “h” y “t” deberían ser iguales, sin embargo, h es solo yo tomando el texto del archivo html y convirtiéndolo manualmente.

¿Cómo resuelvo este problema?

mejor

wheaton

La etiqueta meta del archivo afirma que el conjunto de caracteres es GB2312 , pero los datos contienen un carácter del nuevo GBK / GB18030 y esto es lo que hace que BeautifulSoup se active:

 simon @ lucifer: ~ $ python
 Python 2.7 (r27: 82508, 3 de julio de 2010, 21:12:11) 
 [GCC 4.0.1 (Apple Inc. build 5493)] en darwin
 Escriba "ayuda", "derechos de autor", "créditos" o "licencia" para obtener más información.
 >>> importar urllib2
 >>> datos = urllib2.urlopen ('http://stock.eastmoney.com/news/1408,20101022101395594.html') .read ()
 >>> data.decode ("gb2312")
 Rastreo (llamadas recientes más última):
   Archivo "", línea 1, en 
 UnicodeDecodeError: el codec 'gb2312' no puede decodificar bytes en la posición 20148-20149: secuencia multibyte ilegal

En este punto, UnicodeDammit rescata, prueba chardet , UTF-8 y finalmente Windows-1252 , que siempre tiene éxito, esto es lo que tienes, por lo que parece.

Si le decimos al decodificador que reemplace los caracteres no reconocidos con un ‘?’, Podemos ver el carácter que falta en GB2312:

 >>> imprimir datos [20140: 20160] .decode ("gb2312", "replace")
的 的 排放

Usando la encoding correcta:

 >>> imprimir datos [20140: 20160] .decode ("gb18030", "reemplazar")
的 排放 难
 >>> desde BeautifulSoup importar BeautifulSoup
 >>> s = BeautifulSoup (data, fromEncoding = "gb18030")
 >>> imprimir s.findAll ("p") [2] .string [: 10]
信息 通信 技术 是 &

También:

 >>> imprimir s.findAll ("p") [2] .string
通信 l & ldquo; 十二 是 & rdquo; , 的 的 的 内在 增长
 , 增速 远 高于 PIB。 高于
移动 办公, 移动 网络 游戏, 网络 视频 等均 存在 很强 的 潜在 需求, 使 信息 技术 行业 继续 保持 较
高 增长。