当前位置: 首页 > 后端技术 > Python

Python爬虫 - 教你怎么用正则表达式~

时间:2023-03-26 00:54:57 Python

Python爬虫|教你如何使用正则表达式~爬取网页信息后,关键一步就是提取目标信息;解析方法通常采用正则表达式,可以方便地提取网页数字化数据中的非结构化信息。网络爬虫中使用较多的正则表达式有:.:匹配除换行符外的任意字符\n*:匹配前一个字符0次或无限次?:匹配前一个字符0次或一次.*:贪心算法.*?:非贪心算法()中的数据作为结果输出1.基础知识的概念是字符串运算的逻辑公式;使用预先定义的一些特定字符,以及这些特定字符的组合,形成一个“规则字符串”。这个“规则字符串”用来表达一个对字符串的过滤逻辑;优点:可以准确的抓取我们想要的数据信息;缺点:爬取速度会很慢,时间会变得很长。容易被反爬虫和封ip;正则表达式由字符集[...]、量词(*+?{})、边界(^$)、逻辑(|)、re模块函数五部分组成。一个字符集(\d\w这些也属于字符集,不需要用[]包裹起来)再复杂,在没有量词的情况下,也只代表一个字符。常用规则元字符:是构造正则表达式的基本元素;重复限定符:为了处理一堆乱七八糟的重复问题;在正则表达式4中使用一些重复的限定符,并使用适当的限定符代替重复的部分。分组Python的re模块有分组功能。所谓分组就是去掉匹配到的内容,然后过滤掉需要的内容,相当于二次过滤。括号()用于实现分组,group()和groups()用于获取分组的内容。转义如果要匹配的字符串中包含括号,则正则表达式提供了一种转义方式。即要将这些元字符、限定符或关键字转义为普通字符,只需在转义字符前加一个“\”即可。注意“\”和“/”的区别;条件或正则表达式由符号|表示或者,也称为分支条件,当满足正则表达式中的任何一个分支条件时,则认为匹配成功。例如:区间正则化提供了一个元字符方括号[]来表示区间条件;例如:limit0to9可以写成[0-9]limitA-Z写成[A-Z]limitcertainnumbers[165]总结①正则表达式只能处理字符串,用于模糊匹配;\②正则表达式的区间为闭区间;\③正则表达式的匹配方式:正则项包含在字符串中才能进行匹配,可以使用^$来具体匹配正则项;\④Python使用正则表达式需要插入re模块,面试题等,关注gzh【Python编程学习圈】免费获取,回复关键词【学习资料】即可,抓紧时间!匹配IP地址匹配IP地址正则表达式IP地址由4段组成,每段为0-255,以'.'分隔,如210.134.3.123第一步:\d+.\d+.\d+.\d+,not考虑第二步的长度:\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}考虑第三步的长度:拆分0-99:[1-9]?\d100-199:1\d{2}200-249:2[0-4]\d250-255:25[0-5]组合:(([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5]).){3}([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])可选标志,用于控制正则表达式的匹配方式;正则表达式可以包含一些可选的标志修饰符来控制匹配模式,修饰符被指定为一个可选的标志。可以通过按位或(|)它们来指定多个标志,例如re.I|re.M设置为I和M标志:re.S:make。匹配所有字符,包括换行符;re.I:使匹配不区分大小写;re.L:进行语言环境感知匹配;re.M:多行匹配,影响^和$;re.U:根据Unicode字符集解析字符。这个标志影响\w,\W,\b,\B;re.X:此标志允许您通过提供更灵活的格式来编写更容易理解的正则表达式。2.Re库的基本使用要在Python中使用正则表达式,需要引入re模块,它包含了正则表达式的所有功能。学习这部分是掌握爬虫解析最重要的步骤之一。了解了基础知识后,就可以按照既定的学习路径一路升级打怪。基本介绍Re库是Python的标准库,主要用于字符串匹配。re库使用rawstring(原生字符串类型)表示,表示为r'text',例如邮编表示为r'[1-9]\d{5}'。原生字符串是不包含转义字符的字符串,只需要在字符串前面加上r即可。其实也可以用string类型来表示正则表达式,只是\在string中作为转义字符使用,这样表示会比较麻烦。主要函数函数匹配方法有:.findall()、.seach()、.match(),需要注意它们的区别;编译函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象,该对象有一套正则表达式匹配和替换的方法。re.match()方法re.match()尝试从字符串的开头匹配模式。如果匹配不成功,match()返回None。re.match(pattern,string,flags=0)参数说明:pattern匹配的正则表达式;多线匹配等;常用的flags如下:re.match()方法如果匹配成功则返回一个匹配对象,否则返回None。可以使用group(num)或groups()匹配对象函数获取匹配表达式;匹配对象方法如下:group(num=0):groups():返回包含所有组字符串的元组,从1到都包含组号。match对象的属性:(1)string属性获取用于匹配的string对象(2)re属性使用用于匹配的pattern对象,即匹配内容的正则表达式对象(3)pos属性this属性表示文本中内容正则表达式开始搜索的索引;该值与Pattern.match()和Pattern.seach()方法中的同名参数相同。(4)endpos属性表示正则表达式在文本中结束搜索的索引;该值与Pattern.match()和Pattern.seach()方法中的同名参数相同。(5)lastindex属性表示最后捕获的组在文本中的索引;如果没有捕获组,则为None(6)lastgroup属性表示最后捕获的组别名。如果该组没有别名或没有捕获的组,则将为None。匹配对象的常用方法:re.search()方法re.search()方法扫描整个字符串,返回第一个匹配成功的;re.search(pattern,string,flags=0)参数说明:模式匹配正则表达式;string要匹配的字符串;flags标志,用于控制正则表达式的匹配方式,如:是否区分大小写、多行匹配等;也可以使用group(num)或groups()匹配对象函数来获取匹配表达式。3)re.match()和re.search()的区别re.match()只匹配字符串开头,如果字符串开头不匹配正则表达式,则匹配失败,函数返回None.re.search()匹配整个字符串,直到找到匹配项。示例示例:importreprint(re.match('super','superstition').span())output:(0,5)print(re.match('super','insuperable'))输出:Noneprint(re.search('super','superstition').span())输出:(0,5)print(re.search('super','insuperable').span())output:(2,7)最小匹配re库的贪心匹配和最小匹配例如:match=re.search(r'PY.*N','PYANBNCNDN')对于这种匹配形式,有多个字符串满足这种匹配形式,re默认使用贪心匹配,即输出最长的匹配子串,即输出PYANBNCNDN。如何输出最短子串?,加一个?可以扩展运算符实现最小匹配;例子:match=re.search(r'PY.*?N','PYANBNCNDN')在贪心匹配的基础上扩展了最小匹配,也就是说,在re库中,如果想得到最小匹配,需要扩展运算符。即常见的四种:三、空匹配问题Python爬虫如何处理空正则表达式匹配问题?使用正则表达式匹配URL信息时,有时会匹配到一个空列表,可能有以下几种情况:1)正则表达式的选择方式有误。不建议在网页上按F12,然后自己选择要爬取的内容;直接写正则表达式,因为网页的源代码和我们请求返回的html是不一样的。源码中会有一些隐含字符,/n或/r/n...如果没有隐含字符,会导致匹配到空字符串。解决方法:在def_analysis(self,htmls):设置断点,然后debug2)爬取的内容是动态的,返回的html没有对应信息。比如京东的价格、评论等,这样就不能用正则表达式去匹配,需要从界面上爬取。3)如果以上两种可能都不行,你爬的url反爬虫很厉害,阻止你爬,你可以换ip试试。总结:文章总结了爬虫经常使用的正则表达式中的一些基本使用方法。对于网络爬虫来说,重要的是能够从网页中提取信息。