Python爬虫 之数据解析之bs4

Python爬虫 之数据解析之bs4一 bs4 进行数据解析 1 数据解析的原理 标签定位 提取标签 标签属性中存储的数据值 2 bs4 数据解析的原理 实例化一个 BeautifulSou 对象 并且将网页源码数据加载到该对象中 通过调用 BeautifulSou 对象中相关的属性或者方法进行标签定位和数据提取 二 bs4 库和 lxml 库的安装因为 BeautifulSou 对象是存在 bs4 库中的 而 lxml 是一个解析器 在 bs4 进行数据解析的时候需要 lxml 当我们用 bs4 和 xpath 进行数据解析时都需要这个解析器 1


一、bs4进行数据解析

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

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

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


二、bs4库和lxml库的安装

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

1、bs4:

② 安装环境:

pip install bs4 

在这里插入图片描述

2、lxml:

② 安装环境:

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 BeautifulSoup if __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 requests if __name__ == '__main__': # 将互联网上获取的页面源码加载到该对象中 url = '一个网址' header = { 
       'User-Agent':'一个User-Agent' } page_text = requests.get(url=url,headers=header).text soup = 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 requests if __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') # 详情页soup detail_content = detail_soup.find('div',class_='chapter_content') # 文章内容 content = detail_content.text # 打印文章 # print(content) fp.write(title + '\n' + content + '\n') print(title + '爬取成功!!!') 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230698.html原文链接:https://javaforall.net

(0)
上一篇 2026年2月7日 下午8:01
下一篇 2026年2月7日 下午8:22


相关推荐

  • Activiti流程引擎_activiti工作流原理

    Activiti流程引擎_activiti工作流原理Activiti框架提供的流程引擎配置类ProcessEngineConfiguration的类图如下:下面的图是流程引擎的架构图:由上图我们可以很清楚地从全局角度了解ProcessEngineConfiguration类:1)EngineServices:该接口中定义了获取各种服务类实例对象的方法。2)ProcessEngine:继承EngineServices接口,并增…

    2022年10月20日
    4
  • 同步锁-线程安全问题解决方案「建议收藏」

    同步锁-线程安全问题解决方案「建议收藏」1同步锁1.1前言经过前面多线程编程的学习,我们遇到了线程安全的相关问题,比如多线程售票情景下的超卖/重卖现象.上节笔记点这里-进程与线程笔记我们如何判断程序有没有可能出现线程安全问题,主要有以下三个条件:在多线程程序中+有共享数据+多条语句操作共享数据多线程的场景和共享数据的条件是改变不了的(就像4个窗口一起卖100张票,这个是业务)所以思路可以从第3点”多条语句操作共享数据”入手,既然是在这多条语句操作数据过程中出现了问题那我们可以把有可能出现问题的代码都包裹起来,一次只让一

    2022年7月15日
    15
  • Java经典23结构模型的设计模式(三)——附加代理模式、适配器型号、Facade模式的差异

    Java经典23结构模型的设计模式(三)——附加代理模式、适配器型号、Facade模式的差异

    2022年1月4日
    63
  • java数字取整(向上取整,向下取整,四舍五入)

    java数字取整(向上取整,向下取整,四舍五入)向上取整:Math.ceil(doublea)向下取整:Math.floor(doublea)四舍五入取整:Math.round(doublea)例:Math.ceil(24.2)–>25Math.floor(24.7)–>24Math.round(24.2)–>24Math.round(24.7)–>25

    2022年6月21日
    43
  • leetcode-149. 直线上最多的点数(map+判重)[通俗易懂]

    leetcode-149. 直线上最多的点数(map+判重)[通俗易懂]给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。示例 1:输入: [[1,1],[2,2],[3,3]]输出: 3解释:^|| o| o| o +————->0 1 2 3 4示例 2:输入: [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]输出: 4解释:^|| o| o o| o| o o+—–

    2022年8月11日
    5
  • Java中文乱码问题如何解决?

    Java中文乱码问题如何解决?中文乱码问题一、POST请求参数中文乱码二、Response获取流对象中文乱码一、POST请求参数中文乱码在输入中文或特殊字符时,POST请求参数会出现乱码,由于POST参数是在请求体中,获取POST请求参数通过流来获取,我们设置流的编码即可解决中文乱码问题。因为get方式请求参数在url中,post方式请求参数在请求体中,虽然通过getParameter方式获取参数,但内部仍然是通过流获取参数的值,需要设置流的字符集。【解决办法】:获取请求参数之前,设置流的编码re

    2022年7月8日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号