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

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']

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

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要使用正则表达式爬取关键词数据,你可以使用re.findall()函数或re.finditer()函数。这两个函数都可以在字符串中找到正则表达式所匹配的所有子串。 re.findall(pattern, string, flags=0)函数会返回一个列表,其中包含所有匹配到的子串。如果没有找到匹配的子串,则返回一个空列表。你可以使用这个函数来获取关键词数据。 re.finditer(pattern, string, flags=0)函数会返回一个迭代器,其中包含所有匹配到的子串。你可以使用这个函数来逐个获取关键词数据。 在使用这两个函数之前,你需要定义一个正则表达式的模式字符串,用来匹配你想要获取的关键词数据。模式字符串的语法是特殊的,你可以参考正则表达式的详细特殊模式字符参考来了解常用的特殊模式字符。 下面是一个使用re.findall()函数的例子: ```python import re pattern = r"<a.*?>(.*?)</a>" result = "你的爬取网页数据" keywords = re.findall(pattern, result) print(keywords) ``` 下面是一个使用re.finditer()函数的例子: ```python import re pattern = r"<a.*?>(.*?)</a>" result = "你的爬取网页数据" keywords = \[match.group(1) for match in re.finditer(pattern, result)\] print(keywords) ``` 请注意,你需要将"pattern"替换为你自己定义的正则表达式模式字符串,将"result"替换为你爬取网页数据。 #### 引用[.reference_title] - *1* *2* *3* [网页爬取常用正则表达式介绍](https://blog.csdn.net/qq_44285092/article/details/107944287)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

而又何羡乎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值