了解更多关注微信公众号“木下学Python”吧~
原文:https://blog.csdn.net/zjkpy_5/article/details/81041726
1.常见的正则字符和转义
https://www.imooc.com/article/20354
https://blog.csdn.net/u010760374/article/details/79974586
2.爬取结构
res = requests.get(url,headers = headers)
爬取
names = re.findall('<a.?>(.?)</a>',res.text,re.S) #re.S 换行匹配
3.re.findall('正则表达式',匹配内容,re.S(换行匹配))
匹配所有符合的!
如:
import re
line = '123 is a 321'
p = re.findall(r'[0-9]+',line)
print(p)
结果返回列表 ['123','321']
def get_info(url):
res = requests.get(url,headers = headers)
#判断请求码是否为200
if res.status_code == 200:
contents = re.findall('<p>(.*?)</p>',res.content.decode('utf-8'),re.S)
for content in contents:
f.write(content + '\n')
匹配内容如果为网页上的字,匹配内容写成:res.content.decode('utf-8') 或 res.text;.content 获得二进制代码
4.获取标签中的url
<img width="100" alt="泰坦尼克号" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p457760035.webp" class="">
获取名字:namePat = r'alt="(.*?)" src='
获取url:imgPat = r'src="(.*?)" class='
5.compile() 和 findall() 详解
https://blog.csdn.net/drdairen/article/details/51134816
获取文章链接正则
article_url = '<div class="txt-box">.?(http://.?)"'
article_urls_list.append(re.compile(article_url,re.S).findall(data1))
compile() 是编译函数,把字符串编译成正则,然后用 findall()匹配源码
6.匹配问题:
<span class="pl">出版者:</span> (.*?)<br /> 对
<span class="pl">出版者:</span> (.*?) 错
<span class="pl">表演者: <a href="/search?q=Jason%20Mraz&sid=2995812">Jason Mraz</a>
</span>
这种标签匹配Jason Mraz,
'表演者:.?>(.?)</a>'
7.正则匹配的字符串去掉中间某些部分
可用方法replace('去掉部分',''),用格代替
8.标签问题
1)网页上看到的标签是
,复制下来也是
,但就是错,说明标签是<br />或
2)标签中的内容太长可以省略:
<span class="pl">上映日期:</span><span property="v:initialReleaseDate" content="2006-06-30(中国大陆)">2006-06-30(中国大陆)</span>
<span class="pl">上映日期:.?">(.?)</span>
9.re.match(pattern,string,flags=0):
pattern为正则表达式,string为匹配的字符串,flags 用来控制正则表达式的匹配方式,如是否区分大小写,多行匹配等,
只能从字符串其实位置开始匹配。只能匹配一个!
例如:
import re
line = 'zjk is a handsome boy,he like zxy.!!!'
m = re.match(r'(.) boy,he (.).(.*)',line)
print(m.group(0))
print(m.group(1))
print(m.group(2))
print(m.group(3))
print(m.groups())
print(m.group(0)) 为打印匹配的原字符串 line
print(m.group(1)) 打印第一个括号返回的结果,下面两个同理
print(m.groups()) 打印匹配结果的列表,每一组都以元组形式表
10.re.search
import re
line = 'zjk is a handsome boy,he like zxy.!!!'
m = re.match(r'zxy',line)
n = re.search(r'zxy',line)
print(m)
print(n)
它与 re.match 不同的是扫描整个字符串
11.有 JavaScript 的信息字样的提取
其下的标签也要在源码中提取
<a href="javascript:void(0);" id="js_name">狗熊会</a>
要提取 ‘狗熊会’;使用如下正则会没有结果
<a href="javascript:void(0);" id="js_name">(.*?)</a>
要在网页源代码中提取,网页源代码,以及正则如下
var nickname = "狗熊会" #源代码
var nickname = "(.*?)" #正则
12.re.purge()
清除缓存
13.匹配中文
[\u4e00-\u9fa5]
14.贪婪与非贪婪
贪婪:尽可能匹配一个字符串里面多个符合的
非贪婪:尽可能往后匹配符合的
非贪婪
import re
a = '1234;456789;'
b = re.findall(r'(.*);',a)
print(b)
['1234;456789']
贪婪
import re
a = '1234;456789;'
b = re.findall(r'(.*?);',a)
print(b)
['1234', '456789']
网友评论