UnicodeEncodeError:“cp949”编解码器无法在位置 90 编码字符“\u20a9”:非法多字节序列

Posted

技术标签:

【中文标题】UnicodeEncodeError:“cp949”编解码器无法在位置 90 编码字符“\\u20a9”:非法多字节序列【英文标题】:UnicodeEncodeError: 'cp949' codec can't encode character '\u20a9' in position 90: illegal multibyte sequenceUnicodeEncodeError:“cp949”编解码器无法在位置 90 编码字符“\u20a9”:非法多字节序列 【发布时间】:2014-01-26 11:26:43 【问题描述】:

我是 python 初学者。

我正在尝试抓取 google play store 并导出为 csv 文件。 但我收到一条错误消息。

UnicodeEncodeError: 'cp949' codec can't encode character '\u20a9' in position 90: illegal multibyte sequence

这是我的源代码。

当我命令打印时,它可以工作。 但是导出到 csv 文件时会显示错误消息

请帮帮我

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)

【问题讨论】:

【参考方案1】:

Python 3 以语言环境默认编码打开文本文件;如果该编码无法处理您尝试写入的 Unicode 值,请选择不同的编解码器:

with open('result.csv', 'w', encoding='UTF-8', newline='') as f:

这会将任何 unicode 字符串编码为 UTF-8,这是一种可以处理所有 Unicode 标准的编码。

请注意,csv 模块建议您使用 newline='' 打开文件以防止换行转换。

您还需要在for 循环之外打开文件一次

with open('result.csv', 'w') as f:  # Just use 'w' mode in 3.x
    fields = ('title', 'developer', 'developer_link', 'price', 'rating', 'reviewers',
              'downloads', 'date_published', 'operating_system', 'content_rating',
              'category')
    w = csv.DictWriter(f, )
    w.writeheader()

    for div in soup.findAll( 'div', 'class' : 'details' ):
        #
        # build app_details
        #

        w.writerow(app_details)

【讨论】:

谢谢 :) 我还有一个关于 csv 结果的问题。我尝试了代码并打开了“result.csv”文件。我发现只有一行是最后一个循环结果。你能解释一下为什么它会存储最后一个循环结果吗?? @user3172987:您正在重新打开csv 文件每次循环迭代,这会清除文件并重新开始。每次迭代。移动打开循环的文件out(包括创建DictWriter()对象和调用w.writeheader())并且只在循环中调用w.writerow() @user3172987:完成;给DictWriter()一个你想先写掉的键列表。

以上是关于UnicodeEncodeError:“cp949”编解码器无法在位置 90 编码字符“\u20a9”:非法多字节序列的主要内容,如果未能解决你的问题,请参考以下文章

UnicodeEncodeError:“latin-1”编解码器无法编码字符

“UnicodeEncodeError:‘ascii’编解码器无法编码字符”

Python请求:UnicodeEncodeError:'charmap'编解码器无法编码字符

python3 UnicodeEncodeError错误,cx_oracle模块执行sql报错:UnicodeEncodeError: 'ascii' codec can't

UnicodeEncodeError: 'ascii' 编解码器无法编码字符 u'\u2026'

Python通过'Git Bash'打印Unicode字符串得到'UnicodeEncodeError'