数据解析

编码流程:
--指定url
--发起请求
--获取响应数据
--数据解析
--持久化存储

数据解析的原理概述:
解析的局部的文本内容都会在标签之间或者标签对应的属性中进行存储
1、进行指定的标签的定位
2、标签或者标签对应的属性中存储的数据值进行提取(解析)

数据解析分类:
re解析
bs4解析
xpath解析

 

import requests
import re
url = 'http://www.baidu.com'
header = {
'User-Agent' : ' '
}
data_text = requests.get( url=url,headers= hedader).text
ex = '<div>.*?</div>'
l1 = re.findall( ex , data_text , re.S )
for img in l1:
data_src =img.split( '//' )[ -1 ]
url = 'http://' + data_src
name = data_+src[ -8: ]
data = request.get( url=url , headers=header ).content
with open( name , 'wb' ) as obj:
obj.write( data )

bs4进行数据解析
数据解析原理:
1、标签定位
2、提取标签、标签属性中存储的数据值

bs4数据解析原理:
1、实例化一个beautifulSoup对象,并且将页面的源码数据记载到该对象中
2、通过调用beautifulSoup对象中相关的属性或者方法进行对标签定位和数据提取

环境安装
-pip install bs4
-pip install lxml

如何实例化BeautifulSoup对象:
--from bs4 import BeautifulSoup
--对象的实例化
--1、将本地的html文档中的数据加载到该对象中
fp = open( './test.html ' , ' r ' , enconding=' utf-8 ')
soup = BeautifulSoup( fp , ' lxml ' )
--2、将互联网上获取的页面资源加载到该对象中
page_text = response.text
soup = BeautifulSoup( page_text , ' lxml ' )

--提供的用于数据解析的方法和属性:
-soup.tagName:返回的是文档中第一次出现的tagName对应的标签
-soup.find( ):
find( 'tagName' ):等同于soup.div
属性定位:
--soup.find( 'div',class/id/attr = 'song' )
-soup.findall( 'tagName' ):返回符合要求的所有标签
--select
--select( '某种选择器(id,class,标签...选择器)'),返回的是一个列表
--层级选择器
--soup.select( ' .tang > ul > li >a ' ):表示的是一个层级
--soup.select( '.tang >ul a ' ):空格表示的多个层级

--获取标签之间的文本数据:
--soup.a.text / string / get_text( )
--text / get_text( ) :可以获取某一个标签的文本内容
--string:只可以获取该标签下面的直系的文本内容

--获取标签中属性值:
-soup.a[ 'href' ]

 

bs4来进行解析
import requests
from bs4 import BeautfulSoup

 

url = 'http://www.baidu.com'
header = {
' user-agent ' : ' '
}

page = requests.get( url=url , headers=header )
page.encoding = 'utf-8'

soup = BeautifulSoup( data.text, 'lxml')
a_list = soup.select( ' .tang > ul > li >a ' )
for iteam in a_list:
title_name = iteam.string
url2 = ' http:// ' + iteam[ ' href ' ]
data = requests.get( url=url2 , headers=header ).text
soup = BeautifulSoup( data, 'lxml' )
data_text = soup.find( ' div ' , class_=' tong ' )
with open( './new.txt' , 'w' , encoding='utf-8' ) as file:
file.write( data_text )

 

xpath解析: 最常用且最便捷高效的一种解析方式

xpath解析原理:
-1、实例化一个etree的对象,且需要将被解析的网页源码数据加载到该对象中
-2、调佣etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获

 

环境的安装:
pip install lxml

 

如何实例化一个etree对象:
-1、将本地的html文档中的源代码数据加载到etree对象中
etree.parse( filepath )
-2、可以将网页上获取的源代码加载到该对象中
etree.HTML( 'page_text' )
- xpath( 'xpath表达式' )
- /:表示的从根节点开始定位。表示的是一个 层级
- //:表示的是多个层级。可以表示从任意位置开始定位
- 属性定位://div[ @class='song'] tag[ @attrName='attrValue' ]
- 索引定位:/div[ @class='song'] /p[ 3 ]
- 取文本:
-/ text( ) 获取的是标签中直系的文本内容
-// text( ) 标签中非直系的文本内容 (所有文本内容)
- 取属性:
-/@attrName ==>img/src

 

xpath来进行解析
import requests
from lxml import etree

 

url='https://www.nipic.com/topic/show_27437_1.html'
headers = {
'User-Agent' : ' '
}

 

page = requests.get( url=url,headers=header).text
tree = etree.parse(page)
li_list = tree.xpath( ''//div[@class=" "]/ul/li'' )

 

for li in li_list:
img_href = li.xpath('./a/@href')[0]
url = 'https://www.nipic.com/' + img_href
# print(url)
img_src = li.xpath('./a/img/@src')[0]
# print(img_src)
img_name = img_href.split('/')[-1]
# print(img_name)

 

img_page = requests.get(url=url,headers=header).text
tree = etree.HTML(img_page)
img_down_src = tree.xpath('//div[@id="static"]/img/@src')[0]
# print(img_down_src)
img_url = 'http:' + img_down_src
# print(img_url)
img_data = requests.get(url=img_url,headers=header).content
path = './imga2/' + img_name + '.jpg'

 

with open(path,'wb') as file:
file.write(img_data)
print(img_name + '下载完成!!!')

 

 

posted @ 2022-04-13 14:10  昌尐  阅读(191)  评论(0编辑  收藏  举报