java学习视频 第三代半导体 Android防重复点击 静态IP 开源商城系统 web开发 idea 希腊字母 iic text redux plugins EaselJS Validator 网校直播系统 小程序demo源码 进销存源码 jquery选择子元素 mysql数据库名称 grep不是内部命令 iot系统 spark数据清洗 centos7安装gcc json转object react python正则表达 python基础知识 java中的多态 java使用正则表达式 java抽象方法 java地址 java网课 java遍历set 千千静听绿色版 acmecadconverter stl2stp 脚本之家官网 视频字幕提取器 数据挖掘原理与算法 assist是什么意思
当前位置: 首页 > 学习教程  > 编程语言

网页爬取常用正则表达式的介绍

2020/8/11 20:55:00 文章标签:

    • 0 网页爬取准备
    • 1 正则表达式基础
      • 1.1 正则表达式模式及修饰符(flags)
        • 1.1.1 正则表达式模式
        • 1.1.2 正则表达式修饰符
      • 1.2 正则表达式匹配方法
        • 1.2.1 re.match()函数【单个】
        • 1.2.2 re.search()函数【单个】
        • 1.2.3 re.findall()函数【所有】
        • 1.2.4 re.finditer()函数【所有】
        • 1.2.5 re.split()分割匹配的字符串
        • 1.2.6 re.sub()函数检索和替换
    • 2 常用正则表达式
      • 2.1 贪婪模式
      • 2.2 中文信息
      • 2.3 匹配空白行
      • 2.4 匹配网址

0 网页爬取准备

# 只需 shift+回车 运行本单元格,就可以让jupyter notebook宽屏显示
from IPython.core.display import display, HTML
display(HTML('<style>.container { width:100% !important; }</style>'))

先用一个简单的爬虫获取数据然后利用正则表达式的提取有用的信息。

import requests
# 设置一个输入的值,加载至url中
keyword = input("请输入你要查询的关键字:")
headers = {
    "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Mobile Safari/537.36"
}
# 携带请求参数的url,如果想要爬取不同关键字对应的页面,
# 我们需要将url携带的参数进行动态化
# 实现参数动态化
params = {
    "query":keyword
}
url =" https://www.sogou.com/sogou"
# params参数是一个字典采纳数,保存url时携带参数
response = requests.get(url=url,params=params,headers=headers)
# encoding返回的是响应数据的原始的编码格式,
# 如果给其赋值则表示修改了响应数据的编码格式
response.encoding = "urf-8"
# 3. 获取响应数据
# .text:返回的是字符串形式的响应数据
result = response.text
请输入你要查询的关键字周志华
# 查看获取网页数据信息
# result

1 正则表达式基础

1.1 正则表达式模式及修饰符(flags)

1.1.1 正则表达式模式

模式字符串使用特殊的语法来表示一个正则表达式。正则表达式模式中的字符串的作用就是用来匹配到更长字符串的同样的字符串。由于正则表达式中可能会出现转义字符("\"),因此我们需要在前面加一个(“r”),或者将("\")变为("\ \")。

  • 正则表达式中常用的特殊模式字符参考
  • 正则表达式中详细的特殊模式字符参考

1.1.2 正则表达式修饰符

目的:flags用于控制匹配的模式,单个标志如用re.S,多个标志在中间加"|"即可,如re.S|re.U。正则表达式修饰符即功能说明见下表:

修饰符 功能说明
re.S 使.匹配包括在内的所有字符,即能够实现换行提取
re.M 多行匹配,但是影响^和$
re.I 匹配时对大小写不敏感
re.L 做本地化识别匹配
re.x 该标志通过给予你更加灵活的格式以便于你将正则表达式写得更易于理解
re.U 根据Unicode字符集解析字符,影响\w,\W,\b,\B

1.2 正则表达式匹配方法

1.2.1 re.match()函数【单个】

re.match(pattern, string, flags=0)从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。参数说明:

参数 说明
pattern 匹配的正则表达式
string 需要匹配的字符串
flages 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等

用group(num) 或 groups() 匹配对象函数来获取匹配表达式

获取方法 描述
group(num) 匹配整个表达式的字符串,group()可以一次输入多个组号,返回一个包含那些组所对应值的元组
groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号
import re
string = r'<a href="http://map.sogou.com/#lq=周志华" id="sogou_maps" οnclick="navBar(this,\'#lq=\',false)">地图</a>'
pattern1 = "<a"
# 匹配是否在起始位置,是则返回在的位置,否则返回None
aa = re.match(pattern1,string)
print(aa.span())
pattern2 = "周志华"
bb = re.match(pattern2,string)
print(bb)
(0, 2)
None
# .* 表示任意匹配除换行符(\n,\r)之外的任何单个或多个字符
# .*? 贪婪模式,可匹配所有类型的字符
# ()表示我们要提取的内容
pattern3 = r"(.*)(周志华).*"
cc = re.match(pattern3,string)
print(cc.group(),"\n") # 要匹配的目标字符串
print(cc.group(1),"\n") #  第一组信息
print(cc.group(2),"\n") #  第二组信息
print(cc.groups()) # 获取所有的字符串信息
<a href="http://map.sogou.com/#lq=周志华" id="sogou_maps" onclick="navBar(this,\'#lq=\',false)">地图</a> 

<a href="http://map.sogou.com/#lq= 

周志华 

('<a href="http://map.sogou.com/#lq=', '周志华')

1.2.2 re.search()函数【单个】

re.search(pattern, string, flags=0)遍历整个字符串并返回第一个成功的匹配,参数说明:

参数 说明
pattern 匹配的正则表达式
string 需要匹配的字符串
flages 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等

用group(num) 或 groups() 匹配对象函数来获取匹配表达式

获取方法 描述
group(num) 匹配整个表达式的字符串,group()可以一次输入多个组号,返回一个包含那些组所对应值的元组
groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号
import re
string = r'<a href="http://map.sogou.com/#lq=周志华" id="sogou_maps" οnclick="navBar(this,\'#lq=\',false)">地图</a>'
pattern = "<a"
# 匹配是否在起始位置,是则返回在的位置,否则返回None
aa = re.search(pattern,string)
print(f"{pattern} 第一个匹配的位置为:{aa.span()}")
<a 第一个匹配的位置为:(0, 2)
pattern = r"(a).*(周志华).*"
cc = re.search(pattern,string)
print(cc.span(1),"\n") # 返回匹配成功的整个字符串的索引
print(cc.group(0),"\n") # 匹配的目标字符串
print(cc.group(1),"\n") # 第一组信息
print(cc.group(2),"\n") # 第二组信息
print(cc.groups()) # 获取所有的字符串信息
(1, 2) 

a href="http://map.sogou.com/#lq=周志华" id="sogou_maps" onclick="navBar(this,\'#lq=\',false)">地图</a> 

a 

周志华 

('a', '周志华')

re.compile(pattern, flags=0)函数,用于编译正则表达式,生成一个正则表达式(pattern)对象,供 match()和 search()这两个函数使用。

import re
string = r'<a href="http://map.sogou.com/#lq=周志华" id="sogou_maps" οnclick="navBar(this,\'#lq=\',false)">地图</a>'
pattern = re.compile(r"周志华")
# 匹配是否在起始位置,是则返回在的位置,否则返回None
aa = pattern.search(string)
print(f"{pattern} 第一个匹配的位置为:{aa.span()}")
re.compile('周志华') 第一个匹配的位置为:(34, 37)

1.2.3 re.findall()函数【所有】

re.findall(pattern, string, flags=0)在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

参数 说明
pattern 匹配的正则表达式
string 需要匹配的字符串
flages 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
import re 
pattern = r"<a.*?>(.*?)</a>"
# result 为前面爬虫的爬取的网页数据
aa = re.findall(pattern,result) 
aa[:3]
['高级搜索', '', '拆分关键词']

1.2.4 re.finditer()函数【所有】

re.finditer(pattern, string, flags=0)和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

参数 说明
pattern 匹配的正则表达式
string 需要匹配的字符串
flages 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
import re 
pattern = r"<a.*?>(.*?)</a>"
# result 为前面爬虫的爬取的网页数据
aa = re.finditer(pattern,result) 
# for i in aa:
#     print(i.group(1))

1.2.5 re.split()分割匹配的字符串

re.split(pattern, string, maxsplit=0, flags=0)按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:

参数 说明
pattern 匹配的正则表达式
string 需要匹配的字符串
maxsplit 分隔次数,默认为0
flages 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
import re 
re.split('\W+', 'runoob, runoob, runoob.')
['runoob', 'runoob', 'runoob', '']

1.2.6 re.sub()函数检索和替换

re.sub(pattern, repl, string, count=0, flags=0)用于替换字符串中的匹配项,参数说明:

参数 说明
pattern 匹配的正则表达式
repl 替换的字符串,也可为一个函数
string 被替换的原始字符串
couont 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
flages 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
import re
string = r'http://map.sogou.com/#lq=周志华'
pattern = "周志华"
print(re.sub(pattern,"西瓜书",string))
http://map.sogou.com/#lq=西瓜书

2 常用正则表达式

在线正则表达式测试网址

2.1 贪婪模式

贪婪模式:即无论是什么字符都能提取,".*?"。

import re
string = r'<a uigs-id="tab_adv" href="javascript:void(0);" class="js-settings-tab tab-a">高级2.Aa搜索</a>'
pattern = r"<a .*?>(.*?)</a>"
re.findall(pattern,string)
['高级2.Aa搜索']

2.2 中文信息

import re
string = r'<a uigs-id="tab_adv" href="javascript:void(0);" class="js-settings-tab tab-a">高级,2.Aa搜索</a> \
<a uigs-id="tab_adv" href="javascript:void(0);" class="js-settings-tab tab-a">高级2.Aa搜索</a>'
# 单个中文汉字模式(包括标点字符)
# pattern = '[\u3002\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\u3001\uff1f\u300a\u300b\u4e00-\u9fa5]' 
# 多个中文汉字模式(包括标点字符)
pattern = '[\u3002\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\u3001\uff1f\u300a\u300b\u4e00-\u9fa5]+'
# 单个中文汉字模式,只提取汉字,不含标点符号
# pattern = '[\u4e00-\u9fa5]' 
# 多个中文汉字模式,只提取汉字,不含标点符号
# pattern = '[\u4e00-\u9fa5]+' 
re.findall(pattern,string)
['高级,', '搜索', '高级', '搜索']

2.3 匹配空白行

import re
pattern =r"\n\s*\r"
# result为前面爬虫所获取的网页源代码数据
ax = re.findall(pattern,result)
ax[0]
'\n    \r\n\r'

2.4 匹配网址

import re
pattern = r"[a-zA-z]+://[^\s]*"
re.findall(pattern,result,re.S)[:1]
['https://pb.sogou.com/pv.gif"};new']

这里就列举这几个了,其余可从网址上查看。在爬虫中,还是需要通过自己写正则表达式才能提取到我们需要的信息。


本文链接: http://www.dtmao.cc/news_show_100435.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?