Python3使用CSV模块保存csv文件乱码问题

刚开始学写Python的时候,有一个练习是爬取豆瓣电影TOP250的数据,但是写完之后导出的csv文件里面中文内容都是乱码,

Python3使用CSV模块保存csv文件乱码问题_第1张图片

后来在网上找了好多内容,好多解决办法,最后只有一个有效,那就是:

with open('filename.csv', 'w', encoding='utf-8-sig', newline = '') as f:

修改后执行的效果:

Python3使用CSV模块保存csv文件乱码问题_第2张图片

之前用:

encoding='utf-8='

f.write(codecs.BOM_UTF8)

都没行。

附上完整的简单的爬取豆瓣电影TOP250数据代码:


# 第一步:导入第三方库
import codecs
import requests
import csv
import lxml.html

# 第二步:获取目标网页

# 第三步:解析目标网页
# 定义第一个函数:获取目标网页的数据(网页源代码)
def getSource(url):
    response = requests.get(url)
    response.encoding = 'utf-8'
    return response.content

# 需求:获取电影的标题、副标题、引言、评分、网址
# XPath 根据地址找人的功能

# 定义第二个函数:
def getEveryItem(source):

    selector = lxml.html.document_fromstring(source)
    # //可以提取某个标签所有的信息 @ 选取属性
    # /从根节点选取a/b/c
    movieItemList = selector.xpath('//div[@class="info"]')

    # 定义一个列表:展示信息
    movieList = []

    for eachMovie in movieItemList:
        # 创建一个字典,保存电影信息
        movieDict = {}

        title = eachMovie.xpath('div[@class="hd"]/a/span[@class="title"]/text()')
        # otherTitle = eachMovie.xpath('div[@class="hd"]/a/span[@class="other"]/text()')
        otherTitle = ['']
        link = eachMovie.xpath('div[@class="hd"]/a/@href')
        star = eachMovie.xpath('div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()')
        quote = eachMovie.xpath('div[@class="bd"]/p[@class="quote"]/span/text()')

        # 将数据保存到字典当中
        movieDict['title'] = ''.join(title + otherTitle)
        movieDict['url'] = link
        movieDict['star'] = star
        movieDict['quote'] = quote
        print(movieDict)
        movieList.append(movieDict)

    return movieList

# 第三个函数:下载数据
def writeData(movieList):

    with open('D:\PythonCode\DB\MovieDouban.csv', 'w', encoding='utf-8-sig', newline = '') as f:
        writer = csv.DictWriter(f, fieldnames=['title', 'star', 'quote', 'url'])

        # writer.writeheader()   # 写入表头
        for each in movieList:
            writer.writerow(each)  # 逐行写入数据

if __name__ == '__main__':

    movieList = []

    for i in range(10):

        doubanUrl = f'https://movie.douban.com/top250?start={i * 25}&filter='


        # 有了URL我们就可以获取网页数据--》调用获取网页数据的函数
        source = getSource(doubanUrl)
        # 有了source网页的数据就可以获取电影信息--》调用获取电影信息的函数
        movieList += getEveryItem(source)

    # print(movieList[:10])
    writeData(movieList)


 

你可能感兴趣的:(语言,技术,csv,Python)