赞
踩
# 只需 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
模式字符串使用特殊的语法来表示一个正则表达式。正则表达式模式中的字符串的作用就是用来匹配到更长字符串的同样的字符串。由于正则表达式中可能会出现转义字符("\"),因此我们需要在前面加一个(“r”),或者将("\")变为("\ \")。
目的:flags用于控制匹配的模式,单个标志如用re.S,多个标志在中间加"|"即可,如re.S|re.U。正则表达式修饰符即功能说明见下表:
修饰符 | 功能说明 |
---|---|
re.S | 使.匹配包括在内的所有字符,即能够实现换行提取 |
re.M | 多行匹配,但是影响^和$ |
re.I | 匹配时对大小写不敏感 |
re.L | 做本地化识别匹配 |
re.x | 该标志通过给予你更加灵活的格式以便于你将正则表达式写得更易于理解 |
re.U | 根据Unicode字符集解析字符,影响\w,\W,\b,\B |
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=', '周志华')
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)
re.findall(pattern, string, flags=0)在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
参数 | 说明 |
---|---|
pattern | 匹配的正则表达式 |
string | 需要匹配的字符串 |
flages | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等 |
import re
pattern = r"<a.*?>(.*?)</a>"
# result 为前面爬虫的爬取的网页数据
aa = re.findall(pattern,result)
aa[:3]
['高级搜索', '', '拆分关键词']
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))
re.split(pattern, string, maxsplit=0, flags=0)按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:
参数 | 说明 |
---|---|
pattern | 匹配的正则表达式 |
string | 需要匹配的字符串 |
maxsplit | 分隔次数,默认为0 |
flages | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等 |
import re
re.split('\W+', 'runoob, runoob, runoob.')
['runoob', 'runoob', 'runoob', '']
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=西瓜书
贪婪模式:即无论是什么字符都能提取,".*?"。
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搜索']
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)
['高级,', '搜索', '高级', '搜索']
import re
pattern =r"\n\s*\r"
# result为前面爬虫所获取的网页源代码数据
ax = re.findall(pattern,result)
ax[0]
'\n \r\n\r'
import re
pattern = r"[a-zA-z]+://[^\s]*"
re.findall(pattern,result,re.S)[:1]
['https://pb.sogou.com/pv.gif"};new']
这里就列举这几个了,其余可从网址上查看。在爬虫中,还是需要通过自己写正则表达式才能提取到我们需要的信息。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。