2016-11-30 2 views
0

J'utilise python + BS4 + pyside dans le code, s'il vous plaît regarder la partie du code ci-dessous:UnicodeWarning: Certains caractères ne peuvent être décodés, et ont été remplacés par REMPLACEMENT CARACTÈRE

enter code here 
#coding:gb2312 
import urllib2 
import sys 
import urllib 
import urlparse 
import random 
import time 
from datetime import datetime, timedelta 
import socket 
from bs4 import BeautifulSoup 
import lxml.html 
from PySide.QtGui import * 
from PySide.QtCore import * 
from PySide.QtWebKit import * 

def download(self, url, headers, proxy, num_retries, data=None): 
    print 'Downloading:', url 
    request = urllib2.Request(url, data, headers or {}) 
    opener = self.opener or urllib2.build_opener() 
    if proxy: 
     proxy_params = {urlparse.urlparse(url).scheme: proxy} 
     opener.add_handler(urllib2.ProxyHandler(proxy_params)) 
    try: 
     response = opener.open(request) 
     html = response.read() 
     code = response.code 
    except Exception as e: 
     print 'Download error:', str(e) 
     html = '' 
     if hasattr(e, 'code'): 
      code = e.code 
      if num_retries > 0 and 500 <= code < 600: 
       # retry 5XX HTTP errors 
       return self._get(url, headers, proxy, num_retries-1, data) 
     else: 
      code = None 
    return {'html': html, 'code': code} 
def crawling_hdf(openfile): 
filename = open(openfile,'r') 
namelist = filename.readlines() 
app = QApplication(sys.argv) 
for name in namelist:   
    url = "http://so.haodf.com/index/search?type=doctor&kw="+ urllib.quote(name) 
    #get doctor's home page 
    D = Downloader(delay=DEFAULT_DELAY, user_agent=DEFAULT_AGENT, proxies=None, num_retries=DEFAULT_RETRIES, cache=None) 
    html = D(url) 
    soup = BeautifulSoup(html) 
    tr = soup.find(attrs={'class':'docInfo'}) 
    td = tr.find(attrs={'class':'docName font_16'}).get('href') 
    print td 
    #get doctor's detail information page 
    loadPage_bs4(td) 

filename.close() 

if __name__ == '__main__': 
crawling_hdf("name_list.txt") 

Après je lance le programme, il affiche un message Waring:

Avertissement (des avertissements module): fichier "C: \ Python27 \ lib \ site-packages \ BS4 \ dammit.py", ligne 231 « Certains personnages ne pouvaient pas être décodé, et étaient " UnicodeWarning: Certains caractères n'ont pas pu être décodés, et ont été remplacés avec CARACTÈRE DE REMPLACEMENT.

Je l'ai utilisé print str (html) et trouver toutes les langues chinoises dans tages sont le code désordre.

J'ai essayé d'utiliser les solutions "décoder ou encoder" et "gzip" qui sont recherchées sur ce site, mais ça ne marche pas dans mon cas.

Répondre

0

Merci beaucoup pour votre aide! Il ressemble à cette page est codée dans gbk. Le problème est qu'il n'y a pas de conversion directe entre utf-8 et gbk (que je suis au courant).

J'ai vu cela workaround utilisé auparavant, essayez:

html.encode('latin-1').decode('gbk').encode('utf-8') 
+0

"Pas de conversion directe" - avec cela, vous voulez dire * en Python *? Il n'y a rien de spécial à propos de GBK, c'est juste un autre [encodage régulier] (https://en.wikipedia.org/wiki/GBK). Aussi: UTF8 est juste un système de stockage (pour Unicode), donc même s'il n'y a pas de conversion 'directe', il vaut mieux l'appeler par son nom propre et laisser UTF8 en dehors de cela. – usr2564301

+0

Je ne suis pas sûr de ce que vous voulez dire. Ma compréhension du problème est qu'il existe une page codée gbk que dammit.py ne parvient pas à convertir en utf-8. Je donne une solution de contournement que j'ai vu utilisée en utilisant latin-1 en tant que «traducteur». Étant donné le contexte, je dirais que "en Python" est une donnée. FWIW, s'il y a un meilleur moyen d'aller d'un b à ici, je suis tout à fait pour ça! – jinksPadlock

+0

Cette question aurait été un doublon si celui que vous avez trouvé avait une réponse acceptée ... Pourtant, le commentaire "Le détour sur latin-1 est choquant" aurait dû vous dire quelque chose. – usr2564301

0

GBK est l'un des built-in encodings dans le codecs en Python. Cela signifie que partout où vous avez une chaîne d'octets bruts, vous pouvez utiliser la méthode decode et le nom du codec approprié (ou son alias) pour le convertir en chaîne Unicode native. Les œuvres suivantes (adaptées de https://stackoverflow.com/q/36530578/2564301), dans la mesure où le texte renvoyé ne contient pas de caractères «garbage» ou «inconnu», et est en effet différemment codé que la page source (comme vérifié en enregistrant cela comme un nouveau fichier et en comparant les valeurs pour les caractères chinois).

from urllib import request 

def scratch(url,encode='utf-8'): 
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' 
    headers = {'User-Agent':user_agent} 
    req = request.Request(url,headers=headers) 
    result = request.urlopen(req) 
    page = result.read() 
    u_page = page.decode(encoding="gbk") 
    result.close() 
    print(u_page) 
    return u_page  

page = scratch('http://so.haodf.com/index/search') 
print (page) 
+0

Je mets à jour le programme, s'il vous plaît vérifier –