1.数据解析分类:
正则
bs4(只有python中能用)
xpath(重点)
2.数据解析原理:
解析的局部的文本内容都会在标签之间或标签的属性中进行存储
1.进行指定标签的定位
2.标签或标签对应的属性中存储的数据值进行提取(解析)
3.正则解析:
# 正则表达式
# 贪婪匹配.*
# 和懒惰匹配.*?
# import re
#
# str1 = '<div class="jay">周杰伦</div><div class="jj">林俊杰</div>'
# print(re.findall(r'<div class=".*?">(.*?)</div>', str1)) # ['周杰伦', '林俊杰']
#
# # findall:匹配字符串中所有符合正则的内容
# str2 = 'bob 的电话是10023 pop的电话是12200'
# print(re.findall(r'\d', str2)) # ['1', '0', '0', '2', '3', '1', '2', '2', '0', '0']
# print(re.findall(r'\d+', str2)) # ['10023', '12200']
# #finditer:匹配字符串中所有符合正则的内容【返回的是迭代器】从迭代器中拿内容,需要.group()
# #最重要的
# it=re.finditer(r'\d+', str2)#<callable_iterator object at 0x0000000002213B70>
# for i in it:
# print(i)#<_sre.SRE_Match object; span=(8, 13), match='10023'>
# print(i.group())#10023 12200
# #search,找到一个结果就返回,结果为match对象,拿数据需要.group()
# s=re.search(r'\d+', str2)
# print(s.group())#10023
#
# #预加载正则表达式,能提高一些效率,一个正则在多个地方使用
# obj=re.compile(r'\d+')
# ret=obj.finditer(str2)
# print(ret)#<callable_iterator object at 0x0000000001E93940>
# print(s.group())
import re
str="""
<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='\d+'>.*?</span></div>",re.S)#re.S 让.能匹配换行符
obj=re.compile(r"<div class='(?P<class>.*?)'><span id='(?P<id>\d+)'>(?P<wahehe>.*?)</span></div>",re.S)#加上(?P<abc>)提取内容
res=obj.finditer(str)
for it in res:
print(it.group("wahehe"))
print(it.group("id"))
print(it.group("class"))
# 周杰伦
# 1
# jay
# 林俊杰
# 2
# jj
# 蔡依林
# 3
# jolin
# 郭麒麟
# 4
# sylar
# 李铁
# 5
# tory
实战练习:
图片爬取-需求:糗事百科的热图爬取
import requests
import json
import re
if __name__ =="__main__":
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
}
#图片存储
# url