python爬虫学习(一)数据解析
re解析(运行速度最快)
. 匹配换行符以外的任意字符
\w 匹配字母或数字或下划线
\s 匹配任意的空白符
\d 匹配数字
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配字符串的开始
$ 匹配字符串的结尾
\W 匹配非字母或数字或下划线
\D 匹配非数字
\S 匹配非空白符
a|b 匹配字符a或字符b
() 匹配括号内的表达式,也可以是一个组
[...] 匹配字符组中的字符
eg:[a-zA-Z0-9] 匹配a-z或A-Z或0-9
[^...] 匹配除了字符组中字符的所有字符
量词:控制前面的元字符出现的次数
* 重复零次或更多次
+ 重复一次或更多次
eg:\d+ 匹配所有数字
? 重复零次或一次
{n} 重复n次
eg:{3}重复3次
{n,} 重复n次或更多次
{n,m} 重复n到m次
贪婪匹配和惰性匹配
.* 尽可能多的匹配内容
.*? 尽可能少的匹配内容
利用re模块
findall: 匹配所有字符串中符合正则的内容,返回为一个列表
re.findall(r"\d+","我的电话是:123456,你的电话号码是555555")
#第一个参数是正则 #第二个参数是待匹配字符串
['123456', '555555']
finditer:匹配字符串中所有的内容[返回的是迭代器]
#finditer:匹配字符串中所有的内容[返回的是迭代器] it = re.finditer(r"\d+","我的电话号码是654321,你的电话号码是66666") for i in it: print(i)
print(i.group())
#i.group()可以获得match里的内容
<re.Match object; span=(7, 13), match='654321'> <re.Match object; span=(21, 26), match='66666'>
search:找到一个结果就返回,返回结果一样都是match对象,访问数据要用group()
match:从头开始匹配,类似在正则前加了^
compiler:预加载正则表达式
#预加载正则表达式 obj = re.compile("\d+") ret = obj.finditer("我的电话号码是654321,你的电话号码是66666") for i in ret: print(i.group())
re.compile("正则表达式",re.S) re.S可以实现.也可以匹配换行符
finditer获取指定内容需要给分组
多行字符串可以用''' 内容 '''
获取指定内容可以(?P<分组名字>正则) 可以单独的从正则匹配的内容中进一步提取内容
获取时利用for循环match对象的获取方式group("上一个自己取的名字")
import re s = '''<div class="cfs"><span id = "1">111</span><div> <div class="ttt"><span id = "2">222</span><div> <div class="aaa"><span id = "3">333</span><div> <div class="www"><span id = "4">444</span><div> ''' obj = re.compile(r'<div class=".*?"><span id = "(?P<id>\d+)">(?P<name>.*?)</span><div>',re.S) result = obj.finditer(s) print(result) for i in result: print(i.group("id")) print(i.group("name"))
<callable_iterator object at 0x0000022026EB0580> 1 111 2 222 3 333 4 444
bs4解析
xpath解析

浙公网安备 33010602011771号