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解析

 

posted @ 2021-06-22 18:04  YuyuFishSmile  阅读(110)  评论(0)    收藏  举报