鱼C论坛

 找回密码
 立即注册
查看: 1282|回复: 10

[已解决]请高手帮忙解读出错原因?

[复制链接]
发表于 2020-8-1 10:06:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import scrapy
from C005.items import C005Item
class JklSpider(scrapy.Spider):
    name = 'jkl'
    # allowed_domains = ['www.123.com']
    start_urls = ['https://www.qiushibaike.com/']
    页码 = 1
    def parse(self, response):
        总页数 = int(response.xpath(r'//a/span/text()').extract()[-2][1:-1])
        文字 = response.xpath('//a[@class="recmd-content"]/text()').extract()
        # print(文字)
        item = C005Item()
        item['文字'] = 文字
        yield item
        if self.页码 <= 总页数:
            url = f'https://www.qiushibaike.com/8hr/page/{self.页码}/'
            self.页码 += 1
            yield scrapy.Request(url=url, callback=self.parse)

我的结果是对的,所要的内容已经保存到Csv文件中了   但是返回出报了很多错误不知道如何解决,报错信息如下

Traceback (most recent call last):
  File "d:\program files\python38\lib\site-packages\twisted\internet\defer.py", line 654, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "d:\program files\python38\lib\site-packages\scrapy\utils\defer.py", line 157, in f
    return deferred_from_coro(coro_f(*coro_args, **coro_kwargs))
  File "D:\code\abc\C005\C005\pipelines.py", line 15, in process_item
    数据.to_csv('d:/百科.csv', index=False, header=0, mode='a', encoding='ANSI')
  File "d:\program files\python38\lib\site-packages\pandas\core\generic.py", line 3204, in to_csv
    formatter.save()
  File "d:\program files\python38\lib\site-packages\pandas\io\formats\csvs.py", line 204, in save
    self._save()
  File "d:\program files\python38\lib\site-packages\pandas\io\formats\csvs.py", line 325, in _save
    self._save_chunk(start_i, end_i)
  File "d:\program files\python38\lib\site-packages\pandas\io\formats\csvs.py", line 356, in _save_chunk
    libwriters.write_csv_rows(self.data, ix, self.nlevels, self.cols, self.writer)
  File "pandas\_libs\writers.pyx", line 68, in pandas._libs.writers.write_csv_rows
  File "d:\program files\python38\lib\encodings\mbcs.py", line 25, in encode
    return mbcs_encode(input, self.errors)[0]
UnicodeEncodeError: 'mbcs' codec can't encode characters in position 0--1: invalid character
最佳答案
2020-8-1 10:29:20
本帖最后由 Twilight6 于 2020-8-1 10:30 编辑
jjxx2005 发表于 2020-8-1 10:23
版主,我改成英文文件名问题依就

我在管道文件中保存代码如下、




你电脑安装了 Excel  了吗? 如果用 Excel 打开 csv 文件的确会乱码,要改 Excel 的编码

我去看了下网站就是 utf-8 的编码的  所以你用 utf-8 爬取没事,然后右击打开方式选择记事本就不会出现乱码情况
import pandas as pd
class C005Pipeline:
    def process_item(self, item, spider):
        文字 = item['文字']
        数据 = pd.DataFrame({'a': 文字})
        数据.to_csv('d:\\abc.csv', index=False, header=0, mode='a', encoding='utf-8')
        return item

用上面代码,然后用记事本打开 csv 文件,应该就不会乱码




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-1 10:11:20 From FishC Mobile | 显示全部楼层
看到错误原因明显是因为编码错误导致的
但是在你的代码里并没有看到明显的编码内容
如果不影响使用,可以忽略掉(报错的代码段加上异常处理直接 pass 即可)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-1 10:12:07 From FishC Mobile | 显示全部楼层
以后请不要在代码里使用中文,会导致代码可读性变差
包括其他隐含的 BUG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-1 10:17:25 | 显示全部楼层


报错原因是编码问题,是写入的 csv 文件名含有中文引起的

解决方法就是,只要将写入的 csv 文件名改成全英文的即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-1 10:20:43 | 显示全部楼层
_2_ 发表于 2020-8-1 10:11
看到错误原因明显是因为编码错误导致的
但是在你的代码里并没有看到明显的编码内容
如果不影响使用,可以 ...

我在管道文件中保存代码如下、
import pandas as pd
class C005Pipeline:
    def process_item(self, item, spider):
        文字 = item['文字']
        数据 = pd.DataFrame({'a': 文字})
        数据.to_csv('d:/百科.csv', index=False, header=0, mode='a', encoding='ANSI')
        return item

我不知道为什么,encoding='ANSI'爬取的中文才不是乱码但是报错,如果改成 utf-8  utf8 就不报错了但是乱码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-1 10:23:15 | 显示全部楼层
Twilight6 发表于 2020-8-1 10:17
报错原因是编码问题,是写入的 csv 文件名含有中文引起的

解决方法就是,只要将写入的 csv 文件名改 ...

版主,我改成英文文件名问题依就

我在管道文件中保存代码如下、
import pandas as pd
class C005Pipeline:
    def process_item(self, item, spider):
        文字 = item['文字']
        数据 = pd.DataFrame({'a': 文字})
        数据.to_csv('d:/abc.csv', index=False, header=0, mode='a', encoding='ANSI')
        return item

我不知道为什么,encoding='ANSI'爬取的中文才不是乱码但是报错,如果改成 utf-8  utf8 就不报错了但是乱码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-1 10:25:43 | 显示全部楼层
jjxx2005 发表于 2020-8-1 10:23
版主,我改成英文文件名问题依就

我在管道文件中保存代码如下、

在路径前面加一个 r 试试看 :
import pandas as pd
class C005Pipeline:
    def process_item(self, item, spider):
        文字 = item['文字']
        数据 = pd.DataFrame({'a': 文字})
        数据.to_csv(r'd:/abc.csv', index=False, header=0, mode='a', encoding='ANSI')
        return item

或者  \\:
import pandas as pd
class C005Pipeline:
    def process_item(self, item, spider):
        文字 = item['文字']
        数据 = pd.DataFrame({'a': 文字})
        数据.to_csv('d:\\abc.csv', index=False, header=0, mode='a', encoding='ANSI')
        return item
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-1 10:28:22 | 显示全部楼层
Twilight6 发表于 2020-8-1 10:25
在路径前面加一个 r 试试看 :

版主您好
我试了一下,问题还是一样。仍然报错,似乎必需修改encoding后面的内容,可是一改就乱码了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-1 10:29:20 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-8-1 10:30 编辑
jjxx2005 发表于 2020-8-1 10:23
版主,我改成英文文件名问题依就

我在管道文件中保存代码如下、




你电脑安装了 Excel  了吗? 如果用 Excel 打开 csv 文件的确会乱码,要改 Excel 的编码

我去看了下网站就是 utf-8 的编码的  所以你用 utf-8 爬取没事,然后右击打开方式选择记事本就不会出现乱码情况
import pandas as pd
class C005Pipeline:
    def process_item(self, item, spider):
        文字 = item['文字']
        数据 = pd.DataFrame({'a': 文字})
        数据.to_csv('d:\\abc.csv', index=False, header=0, mode='a', encoding='utf-8')
        return item

用上面代码,然后用记事本打开 csv 文件,应该就不会乱码




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-1 10:42:54 | 显示全部楼层
Twilight6 发表于 2020-8-1 10:29
你电脑安装了 Excel  了吗? 如果用 Excel 打开 csv 文件的确会乱码,要改 Excel 的编码

我去看 ...

真的是这样呀,谢谢,就是excel打开csv才乱码,我的机器默认了excel打开,所以才一直乱码。我用记事本打开完全正常

点评

客气了~  发表于 2020-8-1 10:44
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-19 17:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表