爬虫04——数据解析(一)

回顾——聚焦爬虫:

爬取页面中指定的页面内容;获得相应的数据信息之后的处理我们就称之为数据解析

         编码流程:

                — 指定url

                — 发起请求

                — 获取响应数据

                — 数据解析

                — 持久化存储

数据解析分类:
        — 正则

        — bs4

        — xpath(通用性较强)

数据解析原理概述:

        — 解析的局部的文本内部都会在标签之间或者标签对应的属性中进行存储。

        — 1. 进行指定标签的定位

        — 2. 标签或者标签对应的属性中存储的数据值进行提取(解析)


1、数据解析——正则

        1.1 findall:匹配字符串中所有的符合正则的内容

re.findall(pattern,string,flags=0)
# 用于返回包含所有匹配项的列表。返回string中所有与pattern相匹配的全部字串,返回形式为数组。
import re

# findall:匹配字符串中所有的符合正则的内容
lst = re.findall("m", "mai le fo len,mai ni mei!") #需要寻找的数,字符串
print(lst)  # ['m', 'm', 'm']
#r是指被r前缀的字符串不进行转义
lst1 = re.findall(r"\d+", "5点之前,你要给我5000万")#也可以是需要的正则,字符串
print(lst1)  # ['5', '5000']

#考虑到findall返回到列表效率不高
#finditer: 匹配字符串中所有到内容[返回到是迭代器],从迭代器中拿到内容需要.group()

it=re.finditer(r"\d+", "5点之前,你要给我5000万")
for i in it:
    print(i.group())
'''
返回结果:
5
5000
'''

        1.2 search

import re
#search,找到一个结果就返回,返回的结果是match对象,拿数据需要.group()
s = re.search(r"\d+","我的电话号是:10086,我女朋友的电话是:10010")
print(s.group()) #10086

        1.3 match

# match是从头开始匹配
s = re.match(r"\d+","我的电话号是:10086,我女朋友的电话是:10010") #当开头不是数字就会报错
s1 = re.match(r"\d+","10086,我女朋友的电话是:10010")
print(s1.group()) #10086
print(s.group()) #报错

        1.4 预加载正则表达式(提前编写正则,方便以后调用,提高效率)

import re
obj = re.compile(r"\d+")#存储正则表达式
ret=obj.finditer("我的电话号是:10086,我女朋友的电话是:10010")
for it in ret:
    print(it.group())

        1.4.1 案例:提取指定字符 

import re
s="""
<div class='jay'><span id='1'>郭麒麟</span></div>
<div class='jj'><span id='2'>宋铁</span></div>
<div class='jolin'><span id='3'>大聪明</span></div>
<div class='sylar'><span id='4'>范思辙</span></div>
<div class='tory'><span id='5'>胡说八道</span></div>
"""
#提前编写正则表达式
# (?P<自定义组名>.*?)  -》用于自定义的组名提取数据,P要大写
#后面的re.S是为了换行
obj = re.compile(r"<div class='.*?'><span id='.*?'>(?P<wahaha>.*?)</span></div>",re.S)
result = obj.finditer(s)
for i in result:
    print(i.group("wahaha"))

【运行结果】

需要id值,也可以给id创建组名

import re
s="""
<div class='jay'><span id='1'>郭麒麟</span></div>
<div class='jj'><span id='2'>宋铁</span></div>
<div class='jolin'><span id='3'>大聪明</span></div>
<div class='sylar'><span id='4'>范思辙</span></div>
<div class='tory'><span id='5'>胡说八道</span></div>
"""
obj = re.compile(r"<div class='.*?'><span id='(?P<id>.*?)'>(?P<wahaha>.*?)</span></div>")
result = obj.finditer(s)
for i in result:
    print(i.group("id"))
    print(i.group("wahaha"))


Python 正则表达式 | 菜鸟教程Python 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。 re 模块使 Python 语言拥有全部的正则表达式功能。 compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。 re 模块也提供了与这些方法功能完全一致的函数,这..https://www.runoob.com/python/python-reg-expressions.html#flags

猜你喜欢

转载自blog.csdn.net/m0_48936146/article/details/124436854