本帖最后由 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()
初学者经验不足还请,详细解说一下 |