本文介绍: 在使用爬虫提取网页中的部分信息时,采用到了re.compile()与re.findall()两种方法,目的:把网页中的“某某城市土地规划表”截取打印出来.网页中的代码: <span class=’tabdetails‘>某某城市土地规划表</span>提取的方法:def parse_response(html): pattern = re.compile(‘class=’tabdetails‘>(.*?)</span>’,r..

使用爬虫提取网页中的部分信息时,采用到了re.compile()re.findall()两种方法,目的:把网页中的“某某城市土地规划表”截取打印出来.

网页中的代码

 <span class='tab-details'>某某城市土地规划表</span>

提取的方法:

def parse_response(html):
    pattern = re.compile('class='tab-details'>(.*?)</span>',re.S)
    items = re.findall(pattern,html)  
    print(items)
    
    return items

结果

['某某城市土地规划表']

这里主要讲解patternre.compile()re.findall()定义用法

1.patternpattern 属性规定用于验证输入字段正则表达式

2.re.compile()compile() 方法用于脚本执行过程编译正则表达式,也可用于改变和重新编译正则表达式

举例字符串全局搜索man“,并用 “person替换然后通过 compile() 方法,改变正则表达式,用 “person替换man” 或 “woman“,:

<script type="text/javascript">
var str="Every man in the world! Every woman on earth!";

patt=/man/g;
str2=str.replace(patt,"person");
//用person取代man
document.write(str2+"<br />");

patt=/(wo)?man/g;
patt.compile(patt);
str2=str.replace(patt,"person");
//用person取代man或者woman
document.write(str2);

</script>

 输出(可见第一行中的man都被person取代,出现了woperson,第二行的的man和woman也被person取代,只有person没有其他奇奇怪怪的字符串

Every person in the world! Every woperson on earth!
Every person in the world! Every person on earth!

3.re.findall():额,这个最难搞,主要是为了讲解(.*?)

re.findall()函数返回某种形式(比如String)所有pattern匹配全部字符串,返回形式为数组

下面是findall()函数的两种表示形式:(上面的代码采取的便是第二种形式):

import re
kk = re.compile(r'd+')
kk.findall('one1two2three3four4')
#[1,2,3,4]
 
#注意此处findall()的用法,可传两个参数;
kk = re.compile(r'd+')
re.findall(kk,"one123")
#[1,2,3]

下面的是常用正则表达式

import re
 
str = 'aabbabaabbaa'

# 一个"."就是匹配除 n (换行符)以外的任意个字符
print(re.findall(r'a.b',str))#['aab', 'aab']

# *前面字符出现0次或以上
print(re.findall(r'a*b',str))#['aab', 'b', 'ab', 'aab', 'b']

# 贪婪,匹配从.*前面为开始到后面为结束所有内容
print(re.findall(r'a.*b',str))#['aabbabaabb']

# 非贪婪,遇到开始和结束进行截取,因此截取多次符合的结果,中间没有字符也会被截取
print(re.findall(r'a.*?b',str))#['aab', 'ab', 'aab']

# 非贪婪,与上面一样,只是与上面的相比多了一个括号,只保留括号内容
print(re.findall(r'a(.*?)b',str))#['a', '', 'a']
 
str = '''aabbab
         aabbaa
         bb'''     #后面多加了2个b

# 没有最后一个换行aab算进来
print(re.findall(r'a.*?b',str))#['aab', 'ab', 'aab']

# re.S不会对n进行中断
print(re.findall(r'a.*?b',str,re.S))#['aab', 'ab', 'aab', 'aan         b']

注意.*?‘是对它的前后部分作为开始结束部分进行截取,而’(.*?)‘也是把其前后作为开始结束,但是只截取括号部分,不包含开始结束部分!!!(同时在对前后部分的选择时要注意特征明确点,就是与众不同的的嘛,防止截取出的是其他部分啊)

re.findall中参数re.S的意义:

1.字符串变为(后面多加了2个b)

str = '''aabbab
         aabbaa
         bb'''

2.参数无re.S,没有最后一个换行的aab算进来

print(re.findall(r'a.*?b',str))
#['aab', 'ab', 'aab']

3.参数有re.S,不会对n进行中断

print(re.findall(r'a.*?b',str,re.S))
#['aab', 'ab', 'aab', 'aan         b']

我们一开始的代码中就有re.s,因为在爬取网页的内容时是按照一个一个块的来爬取可以理解并列部分,存在/n分行符

def parse_response(html):
    pattern = re.compile('class='tab-details'>(.*?)</span>',re.S)
    items = re.findall(pattern,html)  
    print(items)
    
    return items

参考

1.HTML input pattern 属性 | 菜鸟教程 (runoob.com)

2.(10条消息) Pattern用法(正则表达式)_woniu317的博客-CSDN博客_pattern

3.JavaScript compile() 方法 (w3school.com.cn)

4.Python 正则表达re模块之findall()详解 – 知乎 (zhihu.com)

原文地址:https://blog.csdn.net/yur_ke/article/details/123931594

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_50326.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注