刘江的博客教程python爬虫的数据解析常用的就三种:
1、正则表达式
2、bs4
3、xpath
其中又以xpath最为常用。
数据解析原理概述:
这就是根据HTML特性,找到指定标签的定位,然后爬取属性或文本。(正则有点不一样)
正则表达式
正则就是写一个“字符串”去匹配文本,符合的就留下,那重点就是怎么写好“字符串”了,在python中要使用正则表达式就要导入Re库,以下举例的都是英文标点符号。
常用操作符
操作符 | 说明 | 实例 |
---|---|---|
. | 表示任何单个字符(不包括换行符) | |
[ ] | 字符集对单个字符给出取值范围 | [abc]表示a、b、c,[a-z]表示a到z单个字符 |
[^ ] | 非字符集对单个字符给出排除范围 | [^abc]表示非a或b或c的单个字符 |
* | 前一个字符0次或无限次扩展 | abc*表示ab、abc、abcc、abccc等 |
+ | 前一个字符1次或无限次扩展 | abc+表示abc、abcc、abccc等 |
? | 前一个字符0次或1次扩展 | abc?表示ab、abc |
| | 左右表达式任意一个 | abc|def表示abc、def |
{m} | 扩展前一字符m次 | ab{2}c表示abbc |
{m,n} | 扩展前一字符m次至n次(含n) | ab{1,2}c表示abc、abbc |
^ | 匹配字符串开头 | ^abc表示abc且在一个字符串的开头 |
$ | 匹配字符串结尾 | abc$表示abc且在一个字符串的结尾 |
( ) | 分组标记,内部只能使用 | 操作符 | (abc)表示abc,(abc|def)表示abc、def |
\d | 数字,等价于[0-9] | |
\w | 单词字符,等价于[A-Z-a-z-0-9] |
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可通过按位or(|)来指定。如re.I | re.M被设置成I和M标志。
常用修饰符
修饰符 | 说明 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别匹配 |
re.M | 多行匹配,影响^和$ |
re.S | 使 . 匹配包括换行符在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响\w,\W,\b,\B |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写的更易于理解 |
Re库主要功能函数
函数 | 说明 |
---|---|
re.search() | 在字符串中搜索匹配正则表达式的第一个位置,返回match对象 |
re.match() | 从一个字符串的开始位置起匹配正则表达式,返回match对象 |
re.findall() | 搜索字符串,以列表类型返回全部能匹配到的子串 |
re.split() | 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型 |
re.finditer() | 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象 |
re.sub() | 在一个字符串中替换所有正则表达式的子串,返回替换后字符串 |
以上只是常用的操作符,修饰符以及功能函数,还有很多其他的操作符,修饰符和功能函数,大家可以去查看文档。
正则表达式函数的用法
1、search
import re
#创建模式对象
deo = re.compile("CC") #此处的CC,是正则表达式,用来去验证其他的字符串
n = deo.search("ABC") #search字符串是被校验的内容
print(n)
>>None
没有找到返回None
import re
#创建模式对象
deo = re.compile("CC") #此处的CC,是正则表达式,用来去验证其他的字符串
n = deo.search("ABCDABCCDF") #search字符串是被校验的内容
print(n)
>> <re.Match object; span=(6, 8), match='CC'>
找到了返回match对象 ,span=(6,8)的意思是要找的字符串'CC'在字符串"ABCDABCCDF"中的位置是6、7,第一个字符下标为0,span=(6,8)是左闭右开。如果被校验的内容有多出符合正则表达式,search只会返回第一处的位置。
search函数还有另一种写法,不用创建模式对象。
import re
n = re.search("CC","ABCDABCCCCDFCCC") #前面的字符串是正则表达式,后面的字符串是被校验的内容
print(n)
>> <re.Match object; span=(6, 8), match='CC'>
2、findall
如果想要找到被校验内容里所有的字符串就用findall,和search一样findall也有两种写法。
import re
#创建模式对象
deo = re.compile("CC") #此处的CC,是正则表达式,用来去验证其他的字符串
n = deo.findall("ABCDC")
print(n)
>> []
没有找到返回空列表
import re
n = re.findall("CC","ABCDABCCCCDFCCC") #前面的字符串是正则表达式,后面的字符串是被校验的内容
print(n)
>> ['CC', 'CC', 'CC']
找到了就返回一个列表,列表里面有所有符合正则表达式的值。
3、split
以正则表达式为标准分割字符串
import re
#创建模式对象
deo = re.compile("CC") #此处的CC,是正则表达式,用来去验证其他的字符串
n = deo.split("ABCDABCCCCDFCCC")
print(n)
>> ['ABCDAB', '', 'DF', 'C']
4、sub
import re
n = re.sub("CC","cc","ABCDABCCCCDFCCC") #在第三个字符串中找到CC用cc替换
print(n)
>> ABCDABccccDFccC
最后,在正则表达式中,被校验的字符串中前面加上r,就不用担心转义字符的问题。
n = r'sfdf\df./'
print(n)
>> sfdf\df./
下面是常用正则表达式
下面是网络上收集的一些常用正则表达式,请参考使用。 PS:各位在复制粘贴的时候务必要小心前后多余的空格!
校验数字的相关表达式:
功能 | 表达式 |
---|---|
数字 | ^[0-9]*$ |
n位的数字 | ^\d{n}$ |
至少n位的数字 | ^\d{n,}$ |
m-n位的数字 | ^\d{m,n}$ |
零和非零开头的数字 | ^(0|[1-9][0-9]*)$ |
非零开头的最多带两位小数的数字 | ^([1-9][0-9]*)+(.[0-9]{1,2})?$ |
带1-2位小数的正数或负数 | ^(\-)?\d+(\.\d{1,2})?$ |
正数、负数、和小数 | ^(\-|\+)?\d+(\.\d+)?$ |
有两位小数的正实数 | ^[0-9]+(.[0-9]{2})?$ |
有1~3位小数的正实数 | ^[0-9]+(.[0-9]{1,3})?$ |
非零的正整数 | ^[1-9]\d*$ |
非零的负整数 | ^-[1-9]\d*$ |
非负整数 | ^\d+$ |
非正整数 | ^-[1-9]\d*|0$ |
非负浮点数 | ^\d+(\.\d+)?$ |
非正浮点数 | ^((-\d+(\.\d+)?)|(0+(\.0+)?))$ |
正浮点数 | ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ |
负浮点数 | ^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ |
浮点数 | ^(-?\d+)(\.\d+)?$ |
校验字符的相关表达式:
功能 | 表达式 |
---|---|
汉字 | ^[\u4e00-\u9fa5]{0,}$ |
英文和数字 | ^[A-Za-z0-9]+$ |
长度为3-20的所有字符 | ^.{3,20}$ |
由26个英文字母组成的字符串 | ^[A-Za-z]+$ |
由26个大写英文字母组成的字符串 | ^[A-Z]+$ |
由26个小写英文字母组成的字符串 | ^[a-z]+$ |
由数字和26个英文字母组成的字符串 | ^[A-Za-z0-9]+$ |
由数字、26个英文字母或者下划线组成的字符串 | ^\w+$ |
中文、英文、数字包括下划线 | ^[\u4E00-\u9FA5A-Za-z0-9_]+$ |
中文、英文、数字但不包括下划线等符号 | ^[\u4E00-\u9FA5A-Za-z0-9]+$ |
可以输入含有^%&’,;=?$\” 等字符 | [^%&’,;=?$\x22]+ |
禁止输入含有~ 的字符 | [^~\x22]+ |
特殊场景的表达式:
功能 | 表达式 |
---|---|
Email地址 | ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ |
域名 | [a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.? |
InternetURL | [a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ |
手机号码 | ^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$ |
国内电话号码 | \d{3}-\d{8}|\d{4}-\d{7} (0511-4405222、021-87888822) |
身份证号 | ^\d{15}|\d{18}$ (15位、18位数字) |
短身份证号码 | ^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$ (数字、字母x结尾) |
帐号是否合法 | ^[a-zA-Z][a-zA-Z0-9_]{4,15}$ (字母开头,允许5-16字节,允许字母数字下划线) |
密码 | ^[a-zA-Z]\w{5,17}$ (以字母开头,长度在6~18之间,只能包含字母、数字和下划线) |
强密码 | ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$ (必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间) |
日期格式 | ^\d{4}-\d{1,2}-\d{1,2} |
一年的12个月(01~09和1~12) | ^(0?[1-9]|1[0-2])$ |
一个月的31天(01~09和1~31) | ^((0?[1-9])|((1|2)[0-9])|30|31)$ |
xml文件 | ^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$ |
双字节字符 | [^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)) |
空白行的正则表达式 | \n\s*\r (可以用来删除空白行) |
HTML标记的正则表达式 | <(\S*?)[^>]*>.*?</\1>|<.*? /> (对于复杂的嵌套标记依旧无能为力) |
首尾空白字符的正则表达式 | ^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等)) |
腾讯QQ号 | [1-9][0-9]{4,} (腾讯QQ号从10000开始) |
中国邮政编码 | [1-9]\d{5}(?!\d) (中国邮政编码为6位数字) |
IP地址提取 | \d+\.\d+\.\d+\.\d+ (提取IP地址时有用) |
IP地址合法性判断 | ((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)) |
这个常用正则表达式是我从刘江的博客教程这个博主那看到的,感觉挺实用的,大家可以去看看。
常用正则表达式参考博客地址:https://www.liujiangblog.com/course/python/73