python爬虫(一):正则表达式爬取网页文本
文章目录
- 1 正则表达式
- 2 网页文本爬取
- 2.1 单页文本
- 2.2 多页文本
- 2.2.1 演示文本
- 2.2.2 文本信息获取
- 3 实战记录
- 3.1 网页纯文本处理
- 3.1.1 常规网页
- 3.1.2 隐藏域
- 3.2 数据存储
- 3.2.1 csv文件
- 3.2.2 excel文件
- 4 问题记录
1 正则表达式
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解 |
2 网页文本爬取
最近在比比电子招投标交易平台浏览商机信息时发现,大部分的招标投信息都有相同的内容版块,但招投标内容格式又不尽相同。
2.1 单页文本
单页文本爬取可通过Beautiful Soup、Xpath和pyquery进行网页解析,从而避免使用正则表达式,以提高信息获取效率。
2.2 多页文本
多页文本爬取需要综合考虑不同页面布局和内容格式,此时选用正则表达式进行网页解析。
2.2.1 演示文本
(1)列表内容
<tr><td style="width:20%"><span class="num">WBL2020-07(ZTSX[2020]0077)</span><td style="width:40%"><a target="_blank" title="2020年万柏林区下元街道办事处老旧小区改造项目第三标段(众纺路4号院、信息小区、土产小区)招标控制价" href="http://www.bitbid.cn:80/ggWeb/detailGG/zbgg.id_1050416_adType_secondLevelZbgg.html">【控制价】2020年万柏林区下元街道办事处老旧小区改造项目第三标段(众纺路4号院、信息小区、土产小区)招标控制价</a></td><td style="width:10%">工程</td><td style="width:10%">山西省</td><td style="width:10%">2020-05-13</td><td style="width:10%">483</td>
</tr><tr><td style="width:20%"><span class="num">SXWC-2020-7034</span><td style="width:40%"><a target="_blank" title="大同煤矿集团大同煤炭运销黄土坡集运站有限公司环保煤棚重新招标招标公告" href="http://www.bitbid.cn:80/ggWeb/detailGG/zbgg.id_1050415_adType_secondLevelZbgg.html">大同煤矿集团大同煤炭运销黄土坡集运站有限公司环保煤棚重新招标招标公告</a></td><td style="width:10%">工程</td><td style="width:10%">山西省</td><td style="width:10%">2020-05-13</td><td style="width:10%">200</td>
</tr>
(2)文本内容
<div class="content"><h3>2020年万柏林区下元街道办事处老旧小区改造项目第三标段(众纺路4号院、信息小区、土产小区)招标控制价<p class="sum" style="font-weight: normal">发布时间:2020-05-13 14:49:13 | 附件:无</p></h3><div class="contentmain"><p style="text-align: center; font-size: 18px; text-decoration: underline;">2020年万柏林区下元街道办事处老旧小区改造项目第三标段(众纺路4号院、信息小区、土产小区)招标控制价</p><p style="text-align: center; font-size: 18px; text-decoration: underline;">(招标编号:WBL2020-07(ZTSX[2020]0077))</p><p><br/></p><p><span style="font-size: 16px; font-weight: bolder;">一、内容:</span></p><p style="text-indent: 2em;"><span style="line-height: 1.5em; font-size: 14px; font-weight: normal;">项目名称:2020年万柏林区下元街道办事处老旧小区改造项目第三标段(众纺路4号院、信息小区、土产小区)</span></p><p style="text-indent: 2em;"><span style="line-height: 1.5em; font-size: 14px; font-weight: normal;">招标编号:WBL2020-07(ZTSX[2020]0077)</span></p><p style="text-indent: 2em;"><span style="line-height: 1.5em; font-size: 14px; font-weight: normal;">公布内容: </span></p><p style="text-indent: 2em;"><span style="line-height: 1.5em; font-size: 14px; font-weight: normal;">1、招标控制价总价:10929518.46元,投标人投标总价不得超出招标控制价,否则其投标将被否决。</span></p><p style="text-indent: 2em;"><span style="line-height: 1.5em; font-size: 14px; font-weight: normal;">2、分部分项合计价:9470464.72元</span></p><p style="text-indent: 2em;"><span style="line-height: 1.5em; font-size: 14px; font-weight: normal;">3、措施项目合计价:265516.4元</span></p><p><span style="font-size: 16px; font-weight: bolder;">二、监督部门</span></p><p style="text-indent: 2em;"><span style="line-height: 1.5em; font-size: 14px; font-weight: normal;">本招标项目的监督部门为 太原市万柏林区发展和改革局 。</span></p><p><span style="font-size: 16px; font-weight: bolder;">三、联系方式</span></p><p style="text-indent: 2em;"><span style="line-height: 1.5em; font-size: 14px; font-weight: normal;"></span></p><p style="text-indent: 2em;"><span style="line-height: 1.5em; font-size: 14px; font-weight: normal;">招标人:太原市万柏林区住房和城乡建设局</span></p><p style="text-indent: 2em;"><span style="line-height: 1.5em; font-size: 14px; font-weight: normal;">地址:太原市万柏林区新晋祠路与汇锦街交叉口</span></p><p style="text-indent: 2em;"><span style="line-height: 1.5em; font-size: 14px; font-weight: normal;">联系人:武先生</span></p><p style="text-indent: 2em;"><span style="line-height: 1.5em; font-size: 14px; font-weight: normal;">联系电话:0351-6695795</span></p><p style="text-indent: 2em;"><span style="line-height: 1.5em; font-size: 14px; font-weight: normal;">电子邮件: 1009380373@qq.com</span></p><p style="text-indent: 2em;"><span style="line-height: 1.5em; font-size: 14px; font-weight: normal;"> </span></p><p style="text-indent: 2em;"><span style="line-height: 1.5em; font-size: 14px; font-weight: normal;">招标代理机构:中通建设工程管理有限公司</span></p><p style="text-indent: 2em;"><span style="line-height: 1.5em; font-size: 14px; font-weight: normal;">地址:太原市长风商务区华润大厦T4-12层(长兴路1号)</span></p><p style="text-indent: 2em;"><span style="line-height: 1.5em; font-size: 14px; font-weight: normal;">联系人:李女士</span></p><p style="text-indent: 2em;"><span style="line-height: 1.5em; font-size: 14px; font-weight: normal;">电话:0351-7771113</span></p><p style="text-indent: 2em;"><span style="line-height: 1.5em; font-size: 14px; font-weight: normal;">电子邮件:ztzb02@163.com</span></p><p style="text-indent: 2em;"><span style="line-height: 1.5em; font-size: 14px; font-weight: normal;"></span></p><p style="text-align: right; text-indent: 2em; font-size: 14px; font-weight: normal; margin-top: 150px;">招标人或其招标代理机构主要负责人(项目负责人):<span style="width: 120px; height: 20px; text-align: center; line-height: 20px; border-bottom-color: rgb(0, 0, 0); border-bottom-width: 1px; border-bottom-style: solid; display: inline-block;"></span> (盖章)</p><p><br/></p><p style="text-align: right; text-indent: 2em; font-size: 14px; font-weight: normal; margin-bottom: 0px;">招标人或其招标代理机构:<span style="width: 120px; height: 20px; text-align: center; line-height: 20px; border-bottom-color: rgb(0, 0, 0); border-bottom-width: 1px; border-bottom-style: solid; display: inline-block;"></span>(盖章)</p></div>
2.2.2 文本信息获取
(1)列表详情——<tr></tr> & <td></td>
# 获取tr标签内容
records = re.findall('<tr>(.*?)</tr>', list, re.S|re.M)
# 获取第一个tr标签下的td内容
record = re.findall('<td>(.*?)</td>', records[0], re.S|re.M)
(2)超链接——<a href></a>
# 获取超链接a标签内容
label = re.findall('<a .*?>(.*?)</a>', record[1], re.S|re.M)[0]
# 获取href后url超链接地址
url = re.findall('(?<=href=\").*?(?=\")', record[1], re.S|re.M)[0]
(3)网页标题——<head></head> & <title></title>
# 从列表内容获取title
title = re.findall('(?<=title=\").*?(?=\")', record[1], re.S|re.M)[0]
# 从文本内容获取title
title = re.findall('(?<=<h3>).*?(?=<p)|<h3>(.*?)</h3>', content, re.S|re.M)[0]
(4)文本标签——<span></span>
# 从列表内容获取项目编号
code = re.findall('<span .*?>(.*?)</span>', record[0], re.S|re.M)[0]
# 从文本内容获取项目编号
code = re.findall('(?<=招标编号:).*?(?=<)', content, re.S|re.M)[0]
3 实战记录
3.1 网页纯文本处理
3.1.1 常规网页
response = requests.get(url=url, headers=header) # 获取网页内容
# print(response.encoding) # ISO-8859-1
response = (response.text).encode('ISO-8859-1').decode('UTF-8') # 网页重编码
#----------------------------------------------#
content = BeautifulSoup(response, 'lxml').get_text() # 获取网页纯文本
#----------------------------------------------#
text = re.sub('\s','',content) # 去掉换行等因素造成的文本空格(可选,有时不去掉空格更有利于获取文本内容)
3.1.2 隐藏域
response = requests.get(url=url, headers=header) # 获取网页内容
# print(response.encoding) # ISO-8859-1
response = (response.text).encode('ISO-8859-1').decode('UTF-8') # 网页重编码
#----------------------------------------------#
# 提取隐藏域信息
response = re.findall('(?<=<input type="hidden").*?(?=>)', response, re.S | re.M)
response = ''.join(response)
# 直接选择lxml会消除隐藏域,需搭配两种解析器使用
content = BeautifulSoup(response, 'html.parser').get_text()
content = BeautifulSoup(content, 'lxml').get_text()
3.2 数据存储
3.2.1 csv文件
'''
csv_path:csv文件读写路径
list1, list2:写入信息(列表)
'''
def info_to_csv(csv_path, list1, list2):with open(csv_path, 'a', newline='', encoding='utf-8') as f:f.write("{}, {}".format(list1, list2))f.close()'''
补充内容:将csv转为excel(若爬取网页文本,请慎用)
'''
import csv
def csv_to_excel_pd(csv_path, excel_path):csv = pd.read_csv(csv_path, encoding='utf-8', error_bad_lines=False, delimiter=',')# print(csv)csv.to_excel(excel_path, sheet_name = '文本信息')
3.2.2 excel文件
'''
excel_path:excel文件读写路径
list1, list2:写入信息(列表)
df:写入信息(数据框)
'''
import pandas as pd
# 将爬取的数据以追加的方式保存到本地excel文件
df = pd.DataFrame()
df['01'] = list1
df['02'] = list2
def info_to_excel(excel_path, df):writer = pd.ExcelWriter(excel_path)df.to_excel(writer, sheet_name='文本信息', index=False)writer.save()writer.close()
4 问题记录
(1)pd.read_csv() 提示 OSError: Initializing from file failed?
分析:中文路径影响
解决:指定enginepd.read_csv('path',engine='python')
或借助open函数pd.read_csv(open('path'))
(2)网页乱码如何解决?
分析:查看网页编码requests(url).encoding()
解决:重新编码解码requests(url).text.encode('ISO-8859-1').decode('utf-8')
(3)相对导入当前目录下其它py文件提示:ModuleNotFoundError: No module named ‘main.xxxx’; ‘main’ is not a package?
分析:相对导入只有在父模块已经在当前运行环境中被导入过才有用
解决:绝对路径导入(简单粗暴)
(4)requests.exceptions.ConnectTimeout: HTTPConnectionPool(host=‘xxxx’, port=80): Max retries exceeded with url: ?
分析:requests连接超时,服务器在指定时间没有应答,导致的原因包括url连接过多未关闭
和访问过度频繁
。
解决:在不使用ip代理的情况下,可参考以下两种方法:
① 连接过多未关闭
requests.adapters.DEFAULT_RETRIES = 5 # 增加重连次数
rs = requests.session()
rs.keep_alive = False # 关闭多余连接
② 访问过度频繁
time.sleep()
python爬虫(一):正则表达式爬取网页文本相关推荐
- Python爬虫:Xpath爬取网页信息(附代码)
Python爬虫:Xpath爬取网页信息(附代码) 上一次分享了使用Python简单爬取网页信息的方法.但是仅仅对于单一网页的信息爬取一般无法满足我们的数据需求.对于一般的数据需求,我们通常需要从一个 ...
- Python爬虫——使用正则表达式爬取一本喜欢的小说
使用正则表达式爬取一本喜欢的小说 这个爬虫的案例是对正则表达式的运用,通过这个案例,我们可以对正则表达式有更深入的了解. 1. 信息来源: 努努书坊.爬取的小说:三国演义.链接为:https://ww ...
- Python爬虫——使用正则表达式爬取西安7天的天气预报,并使用prettytable模块输出
使用正则表达式爬取西安7天的天气预报 这个爬虫的案例就是对正则表达式的运用,通过这个案例,我们可以对正则表达式有更加深入的理解. 1. 信息来源: 天气网. 链接为:https://www.tian ...
- (第一个java爬虫)java爬取网页文本并抽取中英文关键词
问题引入 对于给定的任意一个网址,爬取这个网页上的所有文本信息,并抽取出文本的中文和英文关键词 搭建环境 首先需要具备eclipse开发环境.然后导入jsoup包,用来爬取网页,再到这个网址http: ...
- Python爬虫:正则表达式爬取校花网
#正则表达式爬取校花网 # 网址 url = 'http://www.xiaohuar.com' #分页爬取大学校花图片共16页640张美图 1.导入模块 import requests import ...
- python爬虫scrapy框架爬取网页数据_Scrapy-Python
scrapy Scrapy:Python的爬虫框架 实例Demo 抓取:汽车之家.瓜子.链家 等数据信息 版本+环境库 Python2.7 + Scrapy1.12 初窥Scrapy Scrapy是一 ...
- [python] 常用正则表达式爬取网页信息及分析HTML标签总结
这篇文章主要是介绍Python爬取网页信息时,经常使用的正则表达式及方法.它是一篇总结性文章,实用性比较大,主要解决自己遇到的爬虫问题,也希望对你有所帮助~ 当然如果会Selenium基于自动化测试爬 ...
- 【Python爬虫】从零开始爬取Sci-Hub上的论文(串行爬取)
[Python爬虫]从零开始爬取Sci-Hub上的论文(串行爬取) 维护日志 项目简介 步骤与实践 STEP1 获取目标内容的列表 STEP2 利用开发者工具进行网页调研 2.1 提取文章链接和分页链 ...
- Python爬虫实战之爬取糗事百科段子
Python爬虫实战之爬取糗事百科段子 完整代码地址:Python爬虫实战之爬取糗事百科段子 程序代码详解: Spider1-qiushibaike.py:爬取糗事百科的8小时最新页的段子.包含的信息 ...
最新文章
- 人物访谈:松本行弘谈Ruby
- 访问有用户名和密码的网络共享,实现数据导入
- 在哪里可以找到用于读取 YML 配置文件的 Spring 文档
- 让陌生人迅速相爱的36个问题
- laravel 调试mysql_Laravel - MySQL数据库的使用详解3(Query Builder用法2:新增、修改、删除)...
- Cisco 综合交换实验Dynamips.Net实现方法
- 字符串科技:Palindrome Series
- python数学计算模块_Python-NumPy模块数学和统计方法(4)
- python批量导入网页信息_python批量导入数据进Elasticsearch的实例
- r语言 读取dta_R语言与计量经济学(三)异方差
- 电脑上怎么做pdf文件_怎么合并PDF文件?PDF合并软件哪个好?
- 解决MySQL Workbench导出低版本MySQL时报错Unknown table ‘column_statistics’ in information_schema的问题
- 盲盒识别装置-2022TI杯10月联赛D题
- webp图片格式、响应式图片
- python 实时股票行情_python 实时获取股票行情脚本
- android手机刷ios6,2017安卓手机刷机方法
- java web调用百度地图_Java web与web gis学习笔记(二)——百度地图API调用
- JetBrains出品,一款好用到爆的数据库工具,惊艳到了,西安java开发视频
- 余弦定理和新闻的分类(TF-IDF+余弦相似度)
- 健身一般采用的分部训练
热门文章
- python 视频处理技术_Python玩转视频处理(三):从视频中提取女神片段
- Python Web框架比较,选择对的框架让开发更便捷
- linux一些常用指令(根据尚硅谷韩顺平老师视频所写,都是自己手打的)
- 数学口袋精灵bug的发现
- java中的terminated_Java State.TERMINATED屬性代碼示例
- spyder代码折叠
- php删除图片unlink,php unlink 删除有关问题_PHP教程
- Android开发学习路线图-腾讯课堂码牛学院
- 分享:如何创建抖音广告流程—3步就搞定
- 使用计算机写文章属于什么方面的应用,用计算机写文章.doc