吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1019|回复: 13
收起左侧

[求助] python 遇到字典不完整的时候如何删除不规范字典元素?

[复制链接]
zhcj66 发表于 2022-4-9 22:59
本帖最后由 zhcj66 于 2022-4-9 23:08 编辑

刚刚学习python 第一次练习写爬虫 就卡壳了
遇到字典不完整的时候如何删除不规范字典元素?
或者执行return map(la,anchors)  的 'chapter':anchor['chapter'][0] 避免报错呢
[Asm] 纯文本查看 复制代码
1930:{'serial_number': 1931, 'number': ['1066363'], 'chapter': ['第1931章 齐聚']}
1931:{'serial_number': 1932, 'number': ['1066372'], 'chapter': ['第1932章 江辰要讲道']}
1932:{'serial_number': 1933, 'number': ['1066393'], 'chapter': ['第1933章 寻找到楚楚的唯一办法']}
1933:{'serial_number': 1934, 'number': ['1066416'], 'chapter': ['第1934章 索要名额']}
1934:{'serial_number': 1935, 'number': ['1066623'], 'chapter': []}                                         如何删除这个不完整的部分呢?
1935:{'serial_number': 1936, 'number': ['1066791'], 'chapter': ['第1935章 制作请帖']}
1936:{'serial_number': 1937, 'number': ['1066819'], 'chapter': ['第1936章 讲道开始']}
1937:{'serial_number': 1938, 'number': ['1066846'], 'chapter': ['第1937章 道的极致']}
1938:{'serial_number': 1939, 'number': ['1067106'], 'chapter': ['第1938章 进入黑暗世界']}
1939:{'serial_number': 1940, 'number': ['1067120'], 'chapter': ['第1939章 不一样的黑暗世界']}
1940:{'serial_number': 1941, 'number': ['1067132'], 'chapter': ['第1940章 九天十地']}



[Asm] 纯文本查看 复制代码
主要是使用<'chapter':anchor['chapter'][0]>  会在调用1934:时出现报错 

def __refine(self,anchors):
        la = lambda anchor:{
            'serial_number':anchor['serial_number'], 
            'number':anchor['number'][0],
            'chapter':anchor['chapter'][0]  # 会在调用1934:时出现报错 
        }
        return map(la,anchors) #注意如果字典不全,这里会报错(不知道是内存还是什么原因,显示不全)


以下为我完整的学习代码
[Python] 纯文本查看 复制代码
from urllib import request
import re

class Spider():
    url = 'https://www.81zw.com/book/50835/'
    #单词字符/非单词字符所有字符;*:无限多次;?:非贪婪
    root_pattern = '<dd>([\s\S]*?)</dd>'  #'<dd>[\s\S]*?</dd>'加入()就可以把匹配的字符之外的去除'<dd>([\s\S]*?)</dd>'
    number_pattern = '<a href="/book/50835/([\s\S]*?).html"'
    chapter_pattern = '.html"  >([\s\S]*?)</a>'  #章节

    def __fetch_content(self):#匿名函数 -获取内容
        r = request.urlopen(Spider.url)
        htmls = r.read() #读到的是bytes
        htmls = str(htmls,encoding='utf-8')#转换成字符串
        return htmls

    def __analysis(self,htmls): # -分析
        #正则表达式s
        root_html = re.findall(Spider.root_pattern,htmls)
        #print(root_html[0])
        anchors = [] #创建空列表
        serial_number = 0 #创建序号
        for html in root_html:
            number = re.findall(spider.number_pattern,html)
            chapter = re.findall(spider.chapter_pattern,html)
            serial_number += 1
            anchor = {'serial_number':serial_number,'number':number,'chapter':chapter} #创建成字典
            anchors.append(anchor)  #将字典添加到列表最后
        return anchors

    def __copyy(self,anchors):
        anchor = {}
        for a in range(100):
            anchor[a] = anchors[a]
        return anchor

    def __refine(self,anchors):
        la = lambda anchor:{
            'serial_number':anchor['serial_number'],  #这里不做处理(注释掉就舍去了)
            'number':anchor['number'][0],
            'chapter':anchor['chapter'][0],  #.strip() #加入.strip()可以去除空格和换行'chapter':anchor['chapter'][0].strip()
        }
        return map(la,anchors) #注意如果字典不全,这里会报错(不知道是内存还是什么原因,显示不全)
        pass

    def go(self):
        htmls = self.__fetch_content()
        anchors = self.__analysis(htmls)
        # print(anchors)

        #{'serial_number': 1943, 'number': ['1067320'], 'chapter': ['第1942章 一招破阵']}
        print(anchors[len(anchors)-1])

        #{'serial_number': 1, 'number': ['225501'], 'chapter': ['第一章 有我,你就有全世界']}
        print(anchors[0]) 

        #['第一章 有我,你就有全世界']
        print(anchors[0]['chapter'])

        #第一章 有我,你就有全世界
        print(anchors[0]['chapter'][0])

        # anchors = self.__copyy(anchors)
        # print(anchors)
        # anchors = list(self.__refine(anchors))
        # print(anchors)


spider = Spider()
spider.go()


初学者经验不足还请,详细解说一下

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

小人类 发表于 2022-4-9 23:03
直接try,或者你把那些空值删除掉
 楼主| zhcj66 发表于 2022-4-9 23:05
小人类 发表于 2022-4-9 23:03
直接try,或者你把那些空值删除掉

现在刚刚学习,知道用这两种方法其中一个就能解决,但是都不会写,两种办法 能用代码给我写一下吗? 我学习一下吗?
Satori 发表于 2022-4-9 23:16
 楼主| zhcj66 发表于 2022-4-9 23:31
Satori 发表于 2022-4-9 23:16
大哥是在如何学习pyrhon的,分享一下啊

我也是看到论坛一个人发的笔记,他里面有视频,被疫情隔离几天学习了些基本语法,现在遇到问题也是求助于52  ,如有需要视频我在上传云盘
1.png
fuwenyue 发表于 2022-4-10 03:22
[Python] 纯文本查看 复制代码
for od in odl:
    if od['chapter'] ==[]:
        break
    ndl.append(od)
hackerbob 发表于 2022-4-10 07:26
用try和except捕获异常
[Python] 纯文本查看 复制代码
def __refine(self,anchors):
try:
        la = lambda anchor:{
            'serial_number':anchor['serial_number'],  #这里不做处理(注释掉就舍去了)
            'number':anchor['number'][0],
            'chapter':anchor['chapter'][0],  #.strip() #加入.strip()可以去除空格和换行'chapter':anchor['chapter'][0].strip()
        }

        return map(la,anchors) #注意如果字典不全,这里会报错(不知道是内存还是什么原因,显示不全)
except:
         pass
 
Cool_Breeze 发表于 2022-4-10 08:48
if (len(anchor['chapter']) == 0):
    // pass
else:
    /fail
luyers 发表于 2022-4-10 09:32
38行 插入一行
if anchor['chapter']:
唯爱丶雪 发表于 2022-4-10 09:35
你直接判断一下值为不为None就行
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 14:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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