账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    python3 scrpy编写pipe通道时write写入编码问题。
    44
    0
    import json
    
    class TencentPipeline(object):
        def __init__(self):
            self.filename = open("tencent.json", 'w')
    
        def process_item(self, item, spider):
            text = json.dumps(dict(item),ensure_ascii = False) + "\n"
            self.filename.write(str(text.encode("utf-8")))
            return item
        def close_spider(self, spider):
            self.filename.close()
    write 写入必须是str类型的,改为str了,但是读取的数据却全是编码。
    在读取过程中 命令台显示的却是中文,而到文件里面却全是编码。
    我不是转换了编码了吗?
    没成功还是什么问题,求大佬指教。
    0
    打赏
    收藏
    点击回答
        全部回答
    • 共 0 条
    • 一晚八连杀 普通会员 1楼

      在Scrapy中,管道(Pipeline)主要用于处理爬取的数据,如清洗、验证、存储等。如果你在使用write()方法写入数据到文件时遇到编码问题,可能是因为直接将非UTF-8编码的文本写入了文件。

      Python3默认的字符串是Unicode字符串,但如果爬取的网页内容不是以UTF-8编码,则需要先将其转换为UTF-8编码再进行写入。

      例如:

      ```python import scrapy

      class MyPipeline: def process_item(self, item, spider): # 假设item['content']是从网页抓取的非UTF-8编码的内容 content = item['content'].decode('原始编码') # 将原始编码转换为Unicode content_utf8 = content.encode('utf-8') # 将Unicode转换为UTF-8编码

          with open('output.txt', 'a', encoding='utf-8') as f:
              f.write(content_utf8)
      
          return item
      

      ```

      这里的'原始编码'需要你根据实际抓取网页的编码情况来替换,可以通过响应对象的response.encoding属性获取(Scrapy在解析响应时会尝试猜测其编码,但并不一定总是准确)。

      另外,如果你确定所有抓取的内容都是同一种非UTF-8编码,也可以在Scrapy设置中全局指定:

      ```python

      settings.py

      FEED_EXPORT_ENCODING = '原始编码' ```

      然后在管道中直接写入即可,Scrapy会自动处理编码转换。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部