BeautifulSoup库的使用

一.BeautifulSoup库的介绍

  • BeautifulSoup也是一个解析库
  • BS解析数据是依赖解析器的, BS支持的解析器有html.parser, lxml, xml, html5lib等, 其中lxml解析器解析速度快, 容错能力强。
  • BS现阶段应用的解析器多数是lxml

二.BeautifulSoup库的使用方法

from bs4 import BeautifulSoup

# 实例化bs4对象
soup = BeautifulSoup(res.text, 'lxml')
# bs4解析出来的结果会是一个列表
tag = soup.select("CSS选择器表达式")

三.BeautifulSoup库的语法

# CSS选择器:
1.根据节点名及节点层次关系定位标签: 标签选择器  &  层级选择器
soup.select('title')
soup.select('div > ul > li')   # 单层级选择器
soup.select('div li')  # 多层级选择器

2.根据节点的class属性定位标签: class选择器
soup.select('.panel')

3.根据id属性定位标签: id选择器
soup.select('#item')

4.嵌套选择: 对解析的结果再次进行解析
ul_list = soup.select('ul')
for ul in ul_list:
  print(ul.select('li'))

# 获取节点的文本或属性:  
# tag_obj是解析后赋值的变量
tag_obj.string: 获取直接子文本-->如果节点内有与直系文本平行的节点, 该方法拿到的是None
tag_obj.get_text(): 获取子孙节点的所有文本
tag_obj['attribute']: 获取节点属性

四.爬取数据, 并使用BeautifulSoup解析

1).分析页面, 制定爬虫的流程

今天要爬取的页面是诗词名句网中的小说《三国演义》

在这里插入图片描述

  1. 确认url, 我们首先要对小说的列表页进行爬取
    列表页链接
  2. 分析列表页, 从列表页中拿取详情页的链接
    在这里插入图片描述
  3. 对详情页的地址进行拼接, 同时请求详情页
  4. 对详情页面的响应进行解析
  5. 写入文件

2).编写爬虫的代码并解析数据

import time
import requests
from bs4 import BeautifulSoup


# 构造存储小说的路径, 需要自己先创建一个文件夹
FICTION_PATH = "./fictions/"


def spider_fiction():
    """
    1.爬取三国演义
    """
    start_time = time.time()
    url = 'http://www.shicimingju.com/book/sanguoyanyi.html'
    # 定制请求头信息
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)"
                      "Chrome/74.0.3729.108 Safari/537.36",
    }
    # 使用当前地址去请求,获取响应到的列表页
    response_list_page = requests.get(url=url, headers=headers)
    # 对响应到的列表页进行解析,使用lxml解析器
    soup = BeautifulSoup(response_list_page.text, 'lxml')
    # 进行解析获取所有的回合超链接, 超链接都在a标签内
    a_list = soup.select('.book-mulu ul li a')
    for a in a_list:
        # 下面只有子节点, 所以使用string
        name = a.string
        # 获取详情页地址的同时将地址拼接
        href = 'http://www.shicimingju.com' + a['href']
        # 使用获取到的href来访问详情页
        response_detail_page = requests.get(url=href, headers=headers)
        # 获取到详情页的数据首先需要根据数据实例化BeautifulSoup类
        soup_detail = BeautifulSoup(response_detail_page.text, 'lxml')
        # 使用实例化的对象来进行数据解析
        p_list = soup_detail.select('.chapter_content p')
        # 获取到一回合的所有内容后需要将数据正常写入到文件内
        with open(FICTION_PATH + name + '.txt', 'w', encoding='utf-8') as f:
            # 因为解析出来的数据是一个列表,所以要循环遍历
            for p in p_list:
                # python2中的写入文件方法,在python3需要加上file=文件句柄,print自带换行
                print(p.string, file=f)
                # 或者使用write
                # f.write(p.string + "\n")
    end_time = time.time()
    # 测试写入文件总用时时间
    print(end_time-start_time)


if __name__ == '__main__':
    spider_fiction()

五.总结

bs4是纯python编写的解析库, 解析速度相对于xpath来说要慢(xpath底层是C编写的), 所以还是推荐大家使用xpath, 不过bs4最好也要会使用.
xpath解析的文章

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值