我们想要查看一个网页上所有的数据内容,应该如何做呢?相信小伙伴们知道该怎么做。那如果小编在限制一下条件,用到python爬虫和re模块的知识,不知道还有没有人能回答上来这个问题?本篇的内容相较于之前只有纯代码模块,但是代码的内容较多,也算是给小伙伴们一次新的突破和挑战,具体代码一起看看吧。
re_label_script 作者: Klaus_Lyu # -*- coding:utf-8 -*- # 自定义创建文件夹并保存图片 import re import os from urllib.request import urlretrieve content = ''' ''' # 自定义函数,在创建新的文件夹 # 固定,可直接套用 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def mkdir(path): # 去除首位空格 path = path.strip() # 去除尾部符号 ‘\’ path = path.rstrip("\") # 判断路径是否存在 isExists = os.path.exists(path) # 去掉目录路径,返回文件夹名 fp_new = os.path.basename(path) if not isExists: # 如果不存在,则创建目录 os.makedirs(path) os.makedirs(path) print(path + ' 新文件夹' + fp_new + '创建成功') return True else: # 如果目录存在则不创建 print(path + ' 文件夹' + fp_new + '已存在') return False # 当前路径下创建文件夹用来保存图片 # 获取当前路径dir_path dir_path = os.path.abspath(".") # dir_new 绝对路径 dir_new = dir_path + '\pic_down' # 新建文件夹的名字 # 传参并创建新文件夹在当前路径下,文件夹名称为pic_down mkdir(dir_new) # 固定,可直接套用 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ html_script = r'' info_script = re.findall(html_script, content, re.S|re.M) for script in info_script: res_original = r'"original":"(.*?)"' # 原图 pic_script = re.findall(res_original, script) for pic in pic_script: print(pic) # urlretrieve()函数下载图片 filename = os.path.basename(pic) # 去掉目录路径,返回文件名 urlretrieve(pic, dir_new + '\' +filename) #下载图片 re_label_span 过滤等标签 作者: Klaus_Lyu # -*- coding:utf-8 -*- # 过滤等标签 import re language = '''周恩来 性別: 男d異名: (字) 翔宇政黨: 中国共产党''' # 获取table中的tr值 res_tr = r" 籍貫: 浙江省绍兴市(.*?) " info_tr = re.findall(res_tr, language, re.S|re.M) for line in info_tr: # 获取表格第一列 th 属性 res_th = r"(.*?) " info_th = re.findall(res_th, line, re.S|re.M) # print(info_th) # ['性別:']n['異名:']n['政黨:']n['籍貫:'] for mm in info_th: # 处理掉href链接 if "href" in mm: # 如果href链接存在info_th中,则处理 restr = r'(.*?)' # 只获取a标签的内容,不获取链接 re.findall() (.*?) h = re.findall(restr, mm, re.S|re.M) print(h[0]) # 为什么加逗号 else: print(mm) # 为什么加逗号 # 获取表格第二列 th 属性 res_td = r'(.*?)' info_td = re.findall(res_td, line, re.S|re.M) for nn in info_td: # 两个if判断的先后顺序 # 处理掉href链接或者rel等信息 (对于政党中既有span 又有a标签,由于内容是在a标签中,不须考虑span的影响) if "href" in nn: # 判断内容直接所属的标签 res_value = r'(.*?)' # 处理等信息 td_value = re.findall(res_value, nn, re.S|re.M) # print(td_value) for value in td_value: # 一个td中可能会有多个href或者rel等信息 print(value) elif "span" in nn: res_value = r'(.*?)' # 对于政党中,由于已经先判断了href,故不会执行到elif span中 td_value = re.findall(res_value, nn, re.S|re.M) for value in td_value: print(value) else: print(nn) re_label_sub img_replace br (过滤掉换行符) 作者: Klaus_Lyu # -*- coding:utf-8 -*- # 获取中超链接及过滤标签 import os import re value = '''中華民國政治人士 性別: 男''' # # 过滤HTML标签 ,<>包含的内容全部替换为空值 # value = re.sub('<[^>]+>', '', value) # 过滤HTML标签 ,<>包含的内容全部替换为空值 # print(value) # 先过滤掉上诉替换空值后的换行符 if '' in value or 'n' in value: value = value.replace('', '') # 替换为空值 value = value.replace('n', ' ') # n替换为空格 value = re.sub('<[^>]+>', '', value) # <>包含的内容全部替换为空值, 首位有空格 # 中華民國政治人士 性別: 男 政黨: 中國國民黨 value = value.strip() # 去掉value首尾的空格 # 中華民國政治人士 性別: 男 政黨: 中國國民黨 print(value) re_label_table 作者: Klaus_Lyu # -*- coding:utf-8 -*- import re s = ''' 政黨: 中國國民黨序列号DEIN3-39CD3-2093J3 日期2013年1月22日 售价392.70 元 说明仅限5用户使用 ''' info = re.findall(r"(.*?)(.*?)", s, re.S|re.M) for line in info: print(line[0],line[1]) #或者print(line) 一样的结果 # 序列号 DEIN3-39CD3-2093J3 # 日期 2013年1月22日 # 售价 392.70 元 # 说明 仅限5用户使用 # print(line[1]) # DEIN3-39CD3-2093J3 # 2013年1月22日 # 392.70 元 # 仅限5用户使用 re_label_title 作者: Klaus_Lyu # -*- coding:utf-8 -*- import re from urllib.request import urlopen request = urlopen("http://www.csdn.net/";).read().decode('utf-8';) print("方法一:") # re.search() 撇配第一个 title_pat = r"性別: 男''' # 正则表达式获取 性別: 女之间内容 # 核心代码: res_tr = r' (.*?) ' m_tr = re.findall(res_tr, language, re.S|re.M) # /核心代码 for line in m_tr: print(line) # 获取表格第一列th属性 res_th = r'(.*?) ' m_th = re.findall(res_th, line, re.S|re.M) for mm in m_th: print(mm) # 获取表格第二列td属性 res_td = r'(.*?)' m_td = re.findall(res_td, line, re.S|re.M) for nn in m_td: print(nn) # results: # < th > 性別: < / th > < td > 男 < / td > # 性別: # 男 # < th > 性別: < / th > < td > 女 < / td > # 性別: # 女 re_label_head 作者: Klaus_Lyu # -*- coding:utf-8 -*- import re content = """豆瓣电影 Top 250 ;;img { max-width: 100%; } """ # 核心代码: # regex = r'' # regex = r'(?<=)' # regex = r'(?<=link.*?)href=".*?(?=")|(?<=link.*?)href='.*?(?=')' # 前提条件(?<=link.*?)不对,必须是确定的,不能用匹配的表达式,正确的是(?<=link ) link_href = re.findall(r'(?<=)', content,) for line in link_metal: print(line) # http - equiv = "Content-Type" content = "text/html; charset=utf-8" # http - equiv = "Expires" content = "Sun, 6 Mar 2005 01:00:00 GMT" link_metal = re.findall(r'', content,) for line in link_metal: print(line) # # re_label_href 作者: Klaus_Lyu # -*- coding:utf-8 -*- import re from urllib.request import urlopen # !!!!!爬取豆瓣top250首页的源代码 # 自定义函数获取网页源代码,自动获取网站编码格式并按相应格式解码赋值给request def download(html): urlorgs = urlopen(html).read() # 检测url的编码格式 # char_url = chardet.detect(urlorgs) # print(char_url['encoding']) # print(char_url) # {'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'} # url按照对应的编码格式进行解码输出, chardet.detect()内容为key-value字典 # request = urlorgs.decode(char_url['encoding']) request = urlorgs.decode('utf-8') return request # 传参 html,获得正确编码后的网页源代码 request = download("https://movie.douban.com/top250";;) # print(request) # 爬链接要有针对性地根据目标值来观察链接的特征,依据特征进行针对性地爬取 # # 爬取a标签中所有URL链接 (目测意义不大) urls = re.findall(r"", request, re.I|re.M) for url in urls: print(url) # 爬取所有href前缀的link(目测也是意义不大) link_list = re.findall(r"(?<=href=").+?(?=")|(?<=href=').+?(?=')", request) for url in link_list: print(url)
通过上述代码我们能得知,python的re模块在获取大量数据方面同样可以起到作用,只是代码过于复杂,所以不太适合新手小白的学习。小伙伴们也可以复制代码体验一下,向进阶突破的感觉。更多Python学习推荐:PyThon学习网教学中心。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)