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()
初学者经验不足还请,详细解说一下 直接try,或者你把那些空值删除掉 小人类 发表于 2022-4-9 23:03
直接try,或者你把那些空值删除掉
现在刚刚学习,知道用这两种方法其中一个就能解决,但是都不会写,两种办法 能用代码给我写一下吗? 我学习一下吗? 大哥是在如何学习pyrhon的,分享一下啊
Satori 发表于 2022-4-9 23:16
大哥是在如何学习pyrhon的,分享一下啊
我也是看到论坛一个人发的笔记,他里面有视频,被疫情隔离几天学习了些基本语法,现在遇到问题也是求助于52,如有需要视频我在上传云盘 for od in odl:
if od['chapter'] ==[]:
break
ndl.append(od) 用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
if (len(anchor['chapter']) == 0):
// pass
else:
/fail 38行 插入一行
if anchor['chapter']: 你直接判断一下值为不为None就行
页:
[1]
2