人间四月395 2023-11-06 10:41 采纳率: 75%
浏览 52
已结题

pycharm报错An error occurred: 'gb18030' codec can't decode byte 0x8b in position 1

pycharm报错An error occurred: 'gb18030' codec can't decode byte 0x8b in position 1: illegal multibyte sequence

# -*- coding: utf-8 -*-
from urllib import request
from lxml import etree
import csv
def initUrs():
    urls = ['https://www.jjwxc.net/bookbase.php?fw0=0&fbsj0=0&xx0=0&mainview0=0&sd0=0&lx0=0&fg0=0&bq=-1&sortType=4&isfinish=0&collectiontypes=ors&searchkeywords=&page=3']
    return urls
def get(urls):
    for url in urls:
        try:
            data = request.urlopen(url).read().decode('gb18030')
            pData = parse(data)
            out(pData)
        except request.HTTPError as e:
            print(f"HTTP error: {e}")
        except request.URLError as e:
            print(f"URL error: {e}")
        except etree.XPathSyntaxError as e:
            print(f"XPath syntax error: {e}")
        except Exception as e:
            print(f"An error occurred: {e}")
def parse(data):
    pData = etree.HTML(data)
    items = pData.xpath('//tr')[1:]
    itemDatas = []
    for item in items:
        itemData = {}
        tds = item.xpath('./td')
        texts = tds[0].xpath('./a//text()')
        itemData['作者'] = '' if(len(texts) == 0) else texts[0]
        texts = tds[1].xpath('./a//text()')
        itemData['书名'] = '' if(len(texts) == 0) else texts[0]
        texts = tds[2].xpath('.//text()')
        itemData['类型'] = '' if len(texts) == 0 else texts[0].strip().replace('\n', '')
        # .replace('-', '') 去除 原创-纯爱-近代现代-剧情 中的-
        texts = tds[3].xpath('./font//text()')
        itemData['进度'] = '' if(len(texts) == 0) else texts[0]
        texts = tds[4].xpath('.//text()')
        itemData['字数'] = '' if(len(texts) == 0) else texts[0]
        texts = tds[5].xpath('.//text()')
        itemData['积分'] = '' if(len(texts) == 0) else texts[0]
        itemDatas.append(itemData)
    return itemDatas
# 输出并且保存为csv文档
def out(data):
    print(data)
    with open('xiaoshuo3.csv', 'w',encoding='gb18030',newline='') as f:
        csvf = csv.DictWriter(f, fieldnames=['作者', '书名', '类型','进度','字数','积分'])
        csvf.writeheader()
        csvf.writerows(data)
get(initUrs())


img


怎么解决

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-06 12:10
    关注

    【以下回答由 GPT 生成】

    这个问题是因为使用gb18030编码解码字节时,出现了非法的多字节序列,在Python中可以使用utf-8编码替代gb18030进行解码。

    以下是修改后的代码示例:

    # -*- coding: utf-8 -*-
    from urllib import request
    from lxml import etree
    import csv
    
    def initUrs():
        urls = ['https://www.jjwxc.net/bookbase.php?fw0=0&fbsj0=0&xx0=0&mainview0=0&sd0=0&lx0=0&fg0=0&bq=-1&sortType=4&isfinish=0&collectiontypes=ors&searchkeywords=&page=3']
        return urls
    
    def get(urls):
        for url in urls:
            try:
                data = request.urlopen(url).read().decode('utf-8')  # 将编码改为utf-8
                pData = parse(data)
                out(pData)
            except request.HTTPError as e:
                print(f"HTTP error: {e}")
            except request.URLError as e:
                print(f"URL error: {e}")
            except etree.XPathSyntaxError as e:
                print(f"XPath syntax error: {e}")
            except Exception as e:
                print(f"An error occurred: {e}")
    
    def parse(data):
        pData = etree.HTML(data)
        items = pData.xpath('//tr')[1:]
        itemDatas = []
        for item in items:
            itemData = {}
            tds = item.xpath('./td')
            texts = tds[0].xpath('./a//text()')
            itemData['作者'] = '' if len(texts) == 0 else texts[0]
            texts = tds[1].xpath('./a//text()')
            itemData['书名'] = '' if len(texts) == 0 else texts[0]
            texts = tds[2].xpath('./span/text()')
            itemData['评分'] = '' if len(texts) == 0 else texts[0]
            itemDatas.append(itemData)
        return itemDatas
    

    通过修改decode('gb18030')decode('utf-8'),可以解决该问题。如果还有其他问题,请及时反馈,我会尽力提供帮助。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月30日
  • 已采纳回答 11月22日
  • 创建了问题 11月6日

悬赏问题

  • ¥15 三极管电路求解,已知电阻电压和三级关放大倍数
  • ¥15 ADS时域 连续相位观察方法
  • ¥15 Opencv配置出错
  • ¥15 模电中二极管,三极管和电容的应用
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused