zhcj66 发表于 2022-4-9 22:59

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

本帖最后由 zhcj66 于 2022-4-9 23:08 编辑

刚刚学习python 第一次练习写爬虫 就卡壳了
遇到字典不完整的时候如何删除不规范字典元素?
或者执行return map(la,anchors)的 'chapter':anchor['chapter'] 避免报错呢
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章 九天十地']}




主要是使用<'chapter':anchor['chapter']>会在调用1934:时出现报错

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

以下为我完整的学习代码
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)
      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 = anchors
      return anchor

    def __refine(self,anchors):
      la = lambda anchor:{
            'serial_number':anchor['serial_number'],#这里不做处理(注释掉就舍去了)
            'number':anchor['number'],
            'chapter':anchor['chapter'],#.strip() #加入.strip()可以去除空格和换行'chapter':anchor['chapter'].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)

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

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

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

      # 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

大哥是在如何学习pyrhon的,分享一下啊

zhcj66 发表于 2022-4-9 23:31

Satori 发表于 2022-4-9 23:16
大哥是在如何学习pyrhon的,分享一下啊
我也是看到论坛一个人发的笔记,他里面有视频,被疫情隔离几天学习了些基本语法,现在遇到问题也是求助于52,如有需要视频我在上传云盘

fuwenyue 发表于 2022-4-10 03:22

for od in odl:
    if od['chapter'] ==[]:
      break
    ndl.append(od)

hackerbob 发表于 2022-4-10 07:26

用try和except捕获异常def __refine(self,anchors):
try:
      la = lambda anchor:{
            'serial_number':anchor['serial_number'],#这里不做处理(注释掉就舍去了)
            'number':anchor['number'],
            'chapter':anchor['chapter'],#.strip() #加入.strip()可以去除空格和换行'chapter':anchor['chapter'].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就行
页: [1] 2
查看完整版本: python 遇到字典不完整的时候如何删除不规范字典元素?