Python爬虫 之数据解析之bs4

数据解析之bs4

    • 一、bs4进行数据解析
    • 二、bs4库和lxml库的安装
    • 三、BeautifulSoup对象
    • 四、项目实例


一、bs4进行数据解析

1、数据解析的原理
① 标签定位。
② 提取标签、标签属性中存储的数据值。

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

注:bs4是Python独有的,其它语言没有。


二、bs4库和lxml库的安装

因为BeautifulSoup对象是存在bs4库中的。而lxml是一个解析器,在bs4进行数据解析的时候需要lxml,当我们用bs4和xpath进行数据解析时都需要这个解析器。

1、bs4:

① bs4是什么:
它的作用是能够快速方便简单的提取网页中指定的内容,给我一个网页字符串,然后使用它的接口将网页字符串生成一个对象,然后通过这个对象的方法来提取数据

② 安装环境:

pip install bs4

在这里插入图片描述

2、lxml:

① lxml是什么:
lxml是一个解析器,也是以后的的xpath要用到的库,bs4将网页字符串生成对象的时候需要用到解析器,就用lxml,或者使用官方自带的解析器 html.parser

② 安装环境:

pip install lxml

在这里插入图片描述


三、BeautifulSoup对象

1、导入包:

from bs4 import BeautifulSoup

2、对象的实例化:

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

基本写法:

 fp = open('一个本地的html文件','r',endcoding='utf-8')soup = BeautifulSoup(fp,'lxml')

详细的表述:

from bs4 import BeautifulSoupif __name__ == '__main__':# 将本地的html文档中的数据加载到该对象中# ./wenjian.heml:是该目录下的一个html文件,也可以是其它本地的html文件,改个路径就行fp = open('./wenjian.html','r',endcoding='utf-8')soup = BeautifulSoup(fp,'lxml')print(soup)

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

基本写法:

page_text = requests.text
soup = BeautifulSoup(page_text,'lxml')

详细的表述:

from bs4 import BeautifulSoup
import requestsif __name__ == '__main__':# 将互联网上获取的页面源码加载到该对象中url = '一个网址'header = {'User-Agent':'一个User-Agent'}page_text = requests.get(url=url,headers=header).textsoup = BeautifulSoup(page_text,'lxml')print(soup)

我们通常使用第二种方法实例化化BeautifulSoup对象,第一种需要将网页上的信息存储到本地文件中,再进行实例化。而第二种可以之间实例化,方便许多。

3、BeautifulSoup的方法和属性

方法描述实例
.tagName返回html第一次出现的tagName对应的标签soup.div,返回第一次出现div标签对应的数据
find(‘tagName’)等价于soup.tagName,返回html第一次出现的tagName对应的标签soup.find(‘div’),等价于soup.tagName,返回第一次出现div标签对应的数据
find(‘tagName’,属性名)属性定位:返回属性所对应的tagName标签对应的数据,返回符合要求的第一个,只返回一个soup.find(‘div’,class_=‘song’),返回class='song’对应的div标签对应的数据,class是关键字,所以要用class_
find_all(‘tagName’)返回符合要求的所有标签(列表)soup.find_all(‘div’),返回所有有div标签的数据
select(‘某种选择器,可以是id、class、标签…选择器’)返回一个列表soup.select(‘class’),返回class选择器的数据,一个列表
select(‘a > b > c’) / select(‘a > b c’)层级选择器,>表示一个层级,空格表示多个层级。返回一个列表soup.select(‘a > b > c’) / soup.select(‘a > b c’)

获取标签之间的文本数据:

soup.tagName.text / string / get_text()
text / get_text() : 可以获取某一个标签中的所有文本内容
string : 只可以获取该标签下面直系的文本内容

获取标签中属性值:

soup.tagName['属性名']
如:soup.a.['href']

注:tagName 为标签名


四、项目实例

需求:
爬取《三国演义》小说所有的章节标题和章节内容,并将标题和内容存储到 txt 文件中。
网址:https://www.shicimingju.com/book/sanguoyanyi.html

思路:
首先我们打开管理员选项,选中某一刻标题查看右侧框。然后读取每个标题的数据。在首页中解析出章节标题和详情页url。然后实例化BeautifulSoup对象,需要将页面源码数据加载到该对象中。

soup = BeautifulSoup(page_text,'lxml')
li_list = soup.select('.book-mulu > ul > li')

可以用BeautifulSoup的select方法解析对象,这样就读取到了标题信息,同时页得到了详情页的网址信息。

在这里插入图片描述

打开某一个标题,再次点开管理员选项查看右侧框,发现可以用BeautifulSoup的find方法,解析出详情页章节内容。根据从首页读取到的详情页的网址信息,来读取详情页的信息。然后再实例化BeautifulSoup对象,然后用find方法解析对象,然后将文章内容保存下来。

detail_url = 'https://www.shicimingju.com' + li.a['href']               # 每一章节的链接(详情页链接)
# 对详情页发出请求,解析内容
detail_page_taxt = requests.get(url=detail_url,headers=header).text     # 详情页
# 解析出详情页章节内容
detail_soup = BeautifulSoup(detail_page_taxt,'lxml')                    # 详情页soup
detail_content = detail_soup.find('div',class_='chapter_content')
# 文章内容
content = detail_content.text

在这里插入图片描述

代码实现:

from bs4 import BeautifulSoup
import requestsif __name__ == '__main__':url = 'https://www.shicimingju.com/book/sanguoyanyi.html'header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4209.2 Safari/537.36'}page_text = requests.get(url=url,headers=header).text       # 首页响应数据# 在首页中解析出章节标题和详情页url# 实例化BeautifulSoup对象,需要将页面源码数据加载到该对象中soup = BeautifulSoup(page_text,'lxml')li_list = soup.select('.book-mulu > ul > li')# 定义文件fp = open('./sanguoyanyi.txt','w',endcoding='utf-8')for li in li_list:title = li.a.string     # 章节的标题# 打印标题# print(title)detail_url = 'https://www.shicimingju.com' + li.a['href']              	# 每一章节的链接(详情页链接)# 对详情页发出请求,解析内容detail_page_taxt = requests.get(url=detail_url,headers=header).text     # 详情页响应数据# 解析出详情页章节内容detail_soup = BeautifulSoup(detail_page_taxt,'lxml')                    # 详情页soupdetail_content = detail_soup.find('div',class_='chapter_content')# 文章内容content = detail_content.text# 打印文章# print(content)fp.write(title + '\n' + content + '\n')print(title + '爬取成功!!!')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1618652.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】手撕顺序表

一,概念及结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储; 在数组上完成数据的增删查改。 1, 静态顺序表:使用定长数组存储元素。 2.,动态顺序表&#xff1…

java bs项目_BS(Java平台)

采用前后端分离的体系架构。采用前后端分离的开发模式的好处是前端、后台互不影响,发挥各自的特长,提高工作效率。前后端根据约定好的接口规范,按照规范的报文格式分别进行独立开发。前后端开发完成后,进行前后端联调,联调过程中对前后端的参数传递,页面串联,业务逻辑等…

BS架构和CS架构的优缺点

1、CS、BS架构定义 CS(Client/Server):客户端----服务器结构。C/S结构在技术上很成熟,它的主要特点是交互性强、具有安全的存取模式、网络通信量低、响应速度快、利于处理大量数据。因为客户端要负责绝大多数的业务逻辑和UI展示,又称为胖客户端。它充分利用两端硬件,将任…

HAproxy+keepalived高可用配置搭建

目录 一、概述 (一)简介 (二)核心功能 (三)关键特性 (四)应用场景 二、安装 1)拓补图 2)配置 (一)内核配置 (二…

oracle orcl不存在,oracle服务丢失的处理方法之OracleServiceORCL不存在示例

oracle服务是oracle数据库的重要组成部分,下面就教您oracle服务丢失的处理方法,如果您之前遇到过oracle服务丢失的问题,不妨一看。 今天发现数据库服务器上的所有oracle服务都丢失了——也就是说在服务管理器中没有oracle服务了,如OracleOraDb10g_home1TNSListener、Oracle…

如何打开计算机的Oracle服务,win10系统手动启动oracle服务的操作方法

有关win10系统手动启动oracle服务的操作方法想必大家有所耳闻。但是能够对win10系统手动启动oracle服务进行实际操作的人却不多。其实解决win10系统手动启动oracle服务的问题也不是难事,小编这里提示两点:1、打开“服务”窗口。或者“管理”口&#xff1…

在现有oracle服务器上新建一个oracle实例

一 概述 假如一台服务器上已经安装了一个单机版的oracle实例orcl,这时想在这台服务器上再部署一个单机版的oracle实例ystat,则可以参考该文档进行部署。 注意:新实例名不要带特殊字符,下划线也不要。 二 操作步骤 2.1 创建相关…

linux下Oracle服务的启动和关闭

1.前言 确保我们能够访问oracle数据库包含两部分,一个是oracle实例,一个是监听,两个同时开启,我们才能正常的使用数据库,因此我们在关闭和启动oracle服务时,也需要同时操作实例和监听。能够操作linux的工具…

AI绘图(11)stable diffusion 如何写好prompt 四

在最开始我写了三篇关于prompt的,具体的大家可以跳转来去看,以下给出来链接: AI绘图(3)stable diffusion如何写好prompt 一_牧子川的博客-CSDN博客 AI绘图(4)stable diffusion如何写好prompt …

几个nlp的小任务(生成式任务——语言模型(CLM与MLM))

@TOC 本章节需要用到的类库 微调任意Transformers模型(CLM因果语言模型、MLM遮蔽语言模型) CLM MLM 准备数据集 展示几个数据的结构

MERN Stack 教程

This tutorial will show you how to build a full-stack MERN application—in this case, an employee database—with the most current tools available. Before you begin, make sure that you are familiar with Node.js and React.js basics and have Node and Create R…

取消开机自检

1. 打开运行窗口 win R ,输入regedit,点击确定,如图: 2. 一次打开以下节点,如图; 3. 在找到如图所示的节点 4. 双击BootExecute,如图: 5. 清空弹窗中的数据,点击确定&a…

拯救者Y7000 2020新版Bios关闭开机自检

原因 重启按F2进入bios(联想笔记本是F2) 点击boot选项 关闭自检(PXE Boot to LAN改为Disabled)

服务器系统自检时间长,我的服务器开机自检提示:waiting for controller to start...是什么意思,而且要等1-5分钟的时间问题是?...

满意答案 alexteresa 2013.06.11 采纳率:46% 等级:12 已帮助:16267人 你好,电脑开机自检,主要是:“内存有错误”或“非正常关机”引起! 这是解决方法:(原创,引用请说明…

服务器跳过系统自检,win7 64位旗舰版跳过开机自检功能直接进入系统的方法

如果遇到断电或其他情况导致电脑不正常关机,下次开机电脑会出现磁盘自动检测,win7 64位旗舰版系统磁盘自检的过程需要花费好几分钟的时间,来检测到硬盘是否有坏道或系统是否损坏等问题。如果碰到每次开机磁盘会自检好长时间怎么办呢&#xff…

计算机主板 上电顺序,BIOS很熟悉,电脑开机BIOS开机自检顺序你知道吗?

原标题:BIOS很熟悉,电脑开机BIOS开机自检顺序你知道吗? 开机键→主板控制芯片向→CPU发出RESET信号→CPU初始化 当电源供电稳定后,芯片组便撤去RESET信号,CPU马上就从FFFFOH处开始执行指令。注:这个地址在系统BIOS的地址范围内,无论是BIOS还是AMI BIOS,放在这里的只是一…

xp计算机启动检测硬盘,取消WinXP开机自检技巧五则

有时我们正常关闭计算机后,再次开机时发现系统会出现自行检测,这让许多XP用户们感到不方便,那么该怎么取消XP开机自检呢?下面就是具体的方法了,一起来看看吧。 方法①: 假如分区是FAT32格式,将其…

华为服务器自检信息怎么开,服务器开机自检内存

服务器开机自检内存 内容精选 换一换 华为云帮助中心,为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档,帮助您快速上手使用华为云服务。 当对弹性云服务器执行绑定密钥对操作时失败。管理控制台上密…

计算机的开机自检是在 里完成的,计算机的开机自检是在里完成的

摘要: 计算机须办在动的动域内理(火区火必凡是。自检土高指路质路高路堤是堤填度大的土堤于(。计算机)米作业在(高度级高处作业为二时称。... 计算机须办在动的动域内理(火区火必凡是。 开机二级小时作业作业证》动火的《动火期不安全超过有效。 自检土高指路质路高…

开机自检过程和systemd服务

开机自检 自检过程 1:bios开机自检 2:MBR引导 3:grub文件 4:加载内核 5:开启进程 过程解释 第一步:bios开机时自检,检测硬件是否正常 第二部:硬件正常后,将系统控制权…