爬虫--数据解析

数据解析的目的是获取局部的数据

数据解析的方法有正则,xpath,bs4

正则:https://www.cnblogs.com/l1222514/p/11011009.html

正则解析:
  import re
  #正则获取定位 可以获取括号里面的内容
  ex='xxxxx(.*?)xxxx'
  re.findall(ex,page_text,re.S)

bs4解析
 解析原理:
  实例化一个Beautifulsoup的对象,且将页面源码数据加载到该对象中
  使用该对象的相关属性和方法实现标签定位和数据提取
环境的安装:
  pip install bs4
  pip install lxml
实例化Beautifulsoup对象
  BeautifulSoup(page_text,'lxml'):将从互联网上请求到的页面源码数据加载到该对象中
  BeautifulSoup(fp,'lxml'):将本地存储的一样页面源码数据加载到该对象中

bs4的方法:
  from bs4 import BeautifulSoup
  soup = BeautifulSoup(fp,'lxml')
方法1#soup.tagName:只可以定位到第一次出现的tagName标签
  soup.title
  soup.div
方法2#soup.find(‘tagName’)
  soup.find('a') # ==soup.a
方法3#属性定位
  soup.find('div',class_='song')
方法4#find_all
  soup.find_all('div')[2]
方法5#select('选择器') 选择器中class用.表示
  ‘>’:表示一个层级 空格:表示多个层级
  soup.select('.song')
  soup.select('.tang > ul > li > a') #==soup.select('.tang a')

获取文本的方法##取文本:string取的是直系的文本数据,text获取的是全部的数据
  soup.p.string
  soup.find('div',class_='tang').get_text() #==soup.find('div',class_='tang').text
获取属性的方法#取属性
  soup.a['href']
  soup.select('.tang > ul > li > a')[0]['href']

 

xpath解析:
  解析效率比较高
  通用性最强的

环境安装:pip install lxml
解析原理:
  实例化一个etree对象且将即将被解析的页面源码数据加载到该对象中
  使用etree对象中的xpath方法结合着xpath表达式进行标签定位和数据提取
实例化etree对象
  etree.parse('本地文件路径')
  etree.HTML(page_text)


xpath定位方法:
  from lxml import etree
  tree = etree.parse('./test.html')
方法1:#定位title标签
  #第一个/表示根目录
  tree.xpath('/html/head/title')
  tree.xpath('/html//title')
  tree.xpath('//title')
方法2:#定位class=song的div
  tree.xpath('//div[@class="song"]')
  tree.xpath('//div[2]') #xpath表达式中的索引是从1开始
  tree.xpath('//div[@class="tang"]/ul/li[4]/a') #==tree.xpath('//div[@class="tang"]//li[4]/a')

方法3:#取文本(获取李清照)
  /text() 获取直系文本 //text() 获取标签下的所有文本
  tree.xpath('//div[@class="song"]/p[1]/text()')[0]
  tree.xpath('//div[@class="song"]//text()')
方法4:#取属性 /@属性

  tree.xpath('//a/@href')

 

 

#爬取三国演义,使用xpath解析

import requests
from lxml import etree

url = 'https://www.shicimingju.com/book/sanguoyanyi.html'
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
}
#处理乱码问题
respons  = requests.get(url = url,headers=headers)
respons.encoding = 'utf-8'
res_text = respons.text

#实例化etree
tree =etree.HTML(res_text)
li_list = tree.xpath('//div[@class="book-mulu"]//li')
fp = open('./sanguo','w',encoding='utf-8')
for li in li_list:
    title = li.xpath('./a/text()')[0]
    detail_url = 'https://www.shicimingju.com/' +li.xpath('./a/@href')[0]
    #处理乱码问题
    datile_page = requests.get(url = detail_url,headers=headers)
    datile_page.encoding= 'utf-8'
    datile_page=datile_page.text

    tree = etree.HTML(datile_page)
    content = tree.xpath('//div[@class="chapter_content"]//text()')
    print(title,'下载完成')
    #持久化存储
    fp.write(title+'\n'+str(content) + '\n')

fp.close()
fp.flush()

  

 

posted @ 2022-05-08 15:55  QV  阅读(29)  评论(0编辑  收藏  举报