UnicodeEncodeError: 'cp949' codec ne peut pas encoder les caractères '\u20a9' à la position 90: illégal de la séquence multi-octets
Je suis un débutant en python.
Je suis en train de ramper google play store et exporter un fichier csv.
Mais j'ai eu un message d'erreur.
UnicodeEncodeError: 'cp949' codec can't encode character '\u20a9' in position 90: illegal multibyte sequence
Voici mon code source.
Quand je commande d'impression, il fonctionne.
Mais il affiche le message d'erreur lors de l'exportation au format de fichier csv
s'il vous plaît aider moi
from bs4 import BeautifulSoup
import urllib.request
import urllib.parse
import codecs
import json
import pickle
from datetime import datetime
import sys
import csv
import os
req = 'https://play.google.com/store/search?q=hana&c=apps&num=300'
response = urllib.request.urlopen(req)
the_page = response.read()
soup = BeautifulSoup(the_page)
#app_link = soup.find('a', {'class' : 'title'})
#app_url = app_link.get('href')
for div in soup.findAll( 'div', {'class' : 'details'} ):
title = div.find( 'a', {'class':'title'} )
#print(title.get('href'))
app_url = title.get('href')
app_details={}
g_app_url = 'https://play.google.com' + app_url
app_response = urllib.request.urlopen(g_app_url)
app_page = app_response.read()
soup = BeautifulSoup(app_page)
#print(soup)
#print( g_app_url )
title_div = soup.find( 'div', {'class':'document-title'} )
app_details['title'] = title_div.find( 'div' ).get_text().strip()
subtitle = soup.find( 'a', {'class' : 'document-subtitle primary'} )
app_details['developer'] = subtitle.get_text().strip()
app_details['developer_link'] = subtitle.get( 'href' ).strip()
price_buy_span = soup.find( 'span', {'class' : 'price buy'} )
price = price_buy_span.find_all( 'span' )[-1].get_text().strip()
price = price[:-4].strip() if price != 'Install' else 'Free'
app_details['price'] = price
rating_value_meta = soup.find( 'meta', {'itemprop' : 'ratingValue'} )
app_details['rating'] = rating_value_meta.get( 'content' ).strip()
reviewers_count_meta = soup.find( 'meta', {'itemprop' : 'ratingCount'} )
app_details['reviewers'] = reviewers_count_meta.get( 'content' ).strip()
num_downloads_div = soup.find( 'div', {'itemprop' : 'numDownloads'} )
if num_downloads_div: app_details['downloads'] = num_downloads_div.get_text().strip()
date_published_div = soup.find( 'div', {'itemprop' : 'datePublished'} )
app_details['date_published'] = date_published_div.get_text().strip()
operating_systems_div = soup.find( 'div', {'itemprop' : 'operatingSystems'} )
app_details['operating_system'] = operating_systems_div.get_text().strip()
content_rating_div = soup.find( 'div', {'itemprop' : 'contentRating'} )
app_details['content_rating'] = content_rating_div.get_text().strip()
category_span = soup.find( 'span', {'itemprop' : 'genre'} )
app_details['category'] = category_span.get_text()
#print(app_details)
with open('result.csv', 'w') as f: # Just use 'w' mode in 3.x
w = csv.DictWriter(f, app_details.keys())
w.writeheader()
w.writerow(app_details)
Vous devez vous connecter pour publier un commentaire.
Python 3 ouvre les fichiers texte dans les paramètres régionaux par défaut l'encodage; si que l'encodage ne peut pas gérer les valeurs Unicode que vous essayez d'écrire, de se choisir un codec différent:
Que j'avais de coder toutes les chaînes unicode en UTF-8 au lieu de cela, un codage qui permet de traiter l'ensemble de la norme Unicode.
Noter que le
csv
module vous recommande d'ouvrir des fichiers à l'aide denewline=''
pour éviter le saut de ligne traduction.Vous avez également besoin d'ouvrir le fichier que vous venez une fois, à l'extérieur de la
for
boucle:csv
fichier chaque itération de boucle, qui efface le fichier et commence une nouvelle. À chaque itération. Déplacer de l'ouverture du fichier hors de la boucle (y compris la création de laDictWriter()
de l'objet et de l'appel dew.writeheader()
) et appelerw.writerow()
dans la boucle.DictWriter()
une liste de touches que vous voulez écrire loin de la première.