爬虫之数据解析

上一节学习了requests模块的使用,这一节学习数据解析。

数据解析分类

  • 正则表达式
  • bs4
  • xpath(重要)

    数据解析原理概述

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

    聚焦爬虫

编码流程:

  • 指定url
  • 发起请求
  • 获取响应数据
  • 数据解析
  • 持久化存储

    学习基础:Python之正则表达式

    请移步至另一章:python之正则表达式

    使用bs4进行数据解析

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

数据解析步骤:
环境安装:

  • pip install bs4
  • pip install lxml
    bs4数据解析步骤:
  • 导包,from bs4 import BeautifulSoup
  • 实例化bs4对象的两种方法

    1.将本地html文档中的数据加载到该对象中

    1
    2
    fp = open('./苏州大学.html','r',encoding='utf-8')
    soup = BeautifulSoup(fp,'lxml')

    2.将互联网上获取的页面源码加载到该对象中

    1
    2
    page_text = response.text
    soup = BeautifulSoup(page_text,'lxml')
  • 提供的用于数据解析的方法和属性:
    1
    soup.tagName:返回的是html中第一次出现的tagName标签
    1
    2
    3
    4
    soup.find():
    - find('tagName'):等同于soup.tagName
    - 属性定位:
    soup.find('div',class_或id或attr = 'song')
    1
    2
    soup.find_all:
    - soup.find_all('tagName'):返回符合要求的所有标签(列表),同find,一样拥有属性定位功能
    1
    2
    3
    4
    5
    soup.select:
    - soup.select('某种选择器(id,class,标签...选择器'),返回的是一个列表.
    层级选择器:
    - soup.select('.tang > ul > li > a')[0] #层级选择器,>代表一个层级(注意两边要有空格),而[n]代表第n个元素
    - soup.select('.tang > ul a') #空格表示多个层级
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    获取标签之间的文本数据:
    - soup.a.text或者String或者get_text() #两个属性,一个方法
    区别:
    - text或者get_text():可以获取某一个标签中所有的文本内容
    - string:只可以获取该标签下面直系的文本内容

    实例1:
    >>> print(soup.select('.tang > ul a')[0].get_text())
    >>> print(soup.select('.tang > ul a')[0].text)
    >>> print(soup.select('.tang > ul a')[0].string)

    输出1: "清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村."
    "清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村."
    "清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村."

    实例2:
    >>> soup.select('.tang ').text
    >>> soup.select('.tang ').string

    输出2: "清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村."
    "秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山."
    "岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君."
    "杜甫"
    "None"

    HTML部分文本(对应上述实例):
    <div class = "tang">
    <ul>
    <li><a href = "http://www.baidu.com" title = "qing">清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村.</a></li>
    <li><a href = "http://www.163.com" title = "qin">秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山.</a></li>
    <li><a href = "http://www.126.com" alt = "qi">岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君.</a></li>
    <li><a href = "http://www.sina.com" class = "du">杜甫</a></li>
    </ul>
    </div>
    1
    2
    3
    4
    5
    6
    7
    8
    获取标签中属性值:
    - soup.a['href']

    实例:
    >>> print(soup.select('.tang > ul a')[0]['href'])

    输出: "http://www.baidu.com"