Python爬虫教程之利用正则表达式匹配网页内容

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Python爬⾍教程之利⽤正则表达式匹配⽹页内容
⽬录
前⾔
何为正则表达式
Python使⽤正则表达式
爬⾍实例
总结
前⾔
Python爬⾍,除了使⽤⼤家⼴为使⽤的scrapy架构外,还有很多包能够实现⼀些简单的爬⾍,如BeautifulSoup、Urllib、requests,在使⽤这些包时,有的⽹络因为⽐较复杂,⽐较难以找到⾃⼰想要的代码,在这个时候,如果能够使⽤正则表达式,将能很⽅便地爬取到⾃⼰想要的数据。

何为正则表达式
正则表达式是⼀种描述字符串排列的⼀种语法规则,通过该规则可以在⼀个⼤字符串中匹配出满⾜规则的⼦字符串。

简单来说,就是给定了⼀个字符串,在字符串中找到想要的字符串,如⼀个电话号码,⼀个IP地址,⼀个字段,在爬⾍过程中,如果灵活使⽤正则表达式,将极⼤地提升爬⾍效率。

正则表
描述
达式
^匹配字符串的开头
$匹配字符串的末尾。

.匹配任意字符,除了换⾏符,当re.DOTALL标记被指定时,则可以匹配包括换⾏符的任意字符。

[…]⽤来表⽰⼀组字符,单独列出:[amk] 匹配 ‘a',‘m'或'k'
[^…]不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。

re*匹配0个或多个的表达式。

re+匹配1个或多个的表达式。

re?匹配0个或1个由前⾯的正则表达式定义的⽚段,⾮贪婪⽅式
re{ n}
re{ n,}精确匹配n个前⾯表达式。

re{ n,
m}匹配 n 到 m 次由前⾯的正则表达式定义的⽚段,贪婪⽅式
a b
(re)G匹配括号内的表达式,也表⽰⼀个组
(?imx)正则表达式包含三种可选标志:i, m, 或 x 。

只影响括号中的区域。

(?-imx)正则表达式关闭 i, m, 或 x 可选标志。

只影响括号中的区域。

(?: re)类似 (…), 但是不表⽰⼀个组
(?imx:
re)在括号中使⽤i, m, 或 x 可选标志
(?-imx:
re)在括号中不使⽤i, m, 或 x 可选标志
(?#…)注释.
(?= re)前向肯定界定符。

如果所含正则表达式,以 … 表⽰,在当前位置成功匹配时成功,否则失败。

但⼀旦所含表达式已经尝试,匹配引擎根本没有提⾼;模式的剩余部分还要尝试界定符的右边。

(?! re)前向否定界定符。

与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
(?> re)匹配的独⽴模式,省去回溯。

\w匹配字母数字
\W匹配⾮字母数字
\s匹配任意空⽩字符,等价于 [\t\n\r\f].
\S匹配任意⾮空字符
\d匹配任意数字,等价于 [0-9].
\D 匹配任意⾮数字\A
匹配字符串开始\Z
匹配字符串结束,如果是存在换⾏,只匹配到换⾏前的结束字符串。

c \z
匹配字符串结束\G
匹配最后匹配完成的位置。

\b
匹配⼀个单词边界,也就是指单词和空格间的位置。

例如, ‘er\b' 可以匹配"never" 中的 ‘er',但不能匹配 “verb” 中的‘er'。

\B
匹配⾮单词边界。

‘er\B' 能匹配 “verb” 中的 ‘er',但不能匹配 “never” 中的 ‘er'。

\n, \t,
等.
匹配⼀个换⾏符。

匹配⼀个制表符。

等\1…\9匹配第n 个分组的⼦表达式。

\10匹配第n 个分组的⼦表达式,如果它经匹配。

否则指的是⼋进制字符码的表达式。

正则表
达式描述Python 使⽤正则表达式
re.match
import re
str1='123asdfa'
mathch1 = re.match("^[0-9]",str1)
print(mathch1.group())
结果
1
如果要匹配12,则
import re
str1='12s3asdfa'
mathch1 = re.findall("1[0-9]",str1)
print(mathch1)
结果
['12']
修改[0-9]为[10-19]是⽆法匹配到的。

因此,该语句将从头到尾匹配字符,匹配到则结束,需要.group 才能获取到匹配到的值。

re.search
import re
str1='1a2s3asdfa'
mathch1 = re.search("^[0-9]",str1)
print(mathch1.group())
结果
1
从头到尾匹配字符,直到找到⼀个匹配,需要.group 才能获取到匹配到的值。

re.serach()和re.match()的区别,re.search()将匹配所有的字符,re.match 只匹配字符串的开头,如果开头不符合规则,则返回None 。

re.split()
import re
str1='1a2s3asdfa'
mathch1 = re.split("[0-9]",str1)
print(mathch1)
结果
['', 'a', 's', 'asdfa']
将匹配到的字符作为分隔符分隔字符串。

re.findall()
import re
str1='12s3asdfa'
mathch1 = re.findall("[0-9]",str1)
print(mathch1)
运⾏结果
['1', '2', '3']
匹配所有符合规则的字符。

re.sub(pattern, repl, string, count,flag)
import re
str1='12s3asdfa'
mathch1 = re.sub("[0-9]",'|',str1)
print(mathch1)
结果
||s|asdfa
⽤后⾯的字符替换前⾯的符合规则的字符。

爬⾍实例
⾸先⿏标右键查看⽹页源代码
如我们需要爬取电影的名称,我们搜索‘
82年⽣的⾦智英'
正则表达式的思路是通过需要爬去的字段旁边的字符去夹住想要的字符串,如我们需要‘82年⽣⾦智英'这穿字符,我们可以
⽤“13px;">”和“<”去夹住它。

搜索该结构可以发现,只有标题会⽤到该结构,不会误爬到其他⽆关字符串。

下⾯上爬⾍代码
import re
import requests
url='https:///chart'
header={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
}
result= requests.get(url,headers=header)
data=re.findall(r'13px\;\"\>([^\<]+)',result.text)
print(data)
结果是⼀个长度为9的数组。

['82年⽣⾦智英 / Kim Ji-young,Born 1982', '爱尔兰杀⼿(港) / 听说你刷房⼦了', '⼩丑起源电影:罗密欧 / Romeo', '情迷纽约下⾬天(港) / 纽约有⾬', '从前,有个荷⾥活(港) / 从前,有个好莱坞...(台)', '长安盗', '地下6号 / 六尺之下', '丧⼫乐园:连环⼫杀(港) /⼫乐园:脏⽐双拼(台)', '浴⽕的少⼥画像(港) / 燃烧⼥⼦的画像(台)']
该爬⾍需要⽤到headers,不然会拒绝连接。

data=re.findall(r'13px\;\"\>([^\<]+)',result.text)
表⽰在result.text这个长字符串中查找,获取“13px;">”和“<”之间的字符串," \ "代表转移字符,否则⽆法识别这些符号。

这个案例可能不是最好的使⽤正则表达式的例⼦,但是想要给⼤家分享的是,以后如果遇到很复杂的⽹络结构,与其⼀层⼀层解析,不妨换⼀种思路,使⽤正则表达式说不定能够“柳暗花明⼜⼀村”。

总结
到此这篇关于Python爬⾍教程之利⽤正则表达式匹配⽹页内容的⽂章就介绍到这了,更多相关Python爬⾍⽤正则表达式匹配⽹页内容内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

相关文档
最新文档