爬虫专栏第五篇:Python BeautifulSoup 库全解析:从解析器到网页数据爬取实战

在这里插入图片描述

简介:本文围绕 Python 的 BeautifulSoup 库展开,介绍了其安装方式,详细解析了各类解析器(如标准库、lxml 库、xml 库、html5lib 等)的特点与作用,并通过代码案例展示不同解析器在实际应用中的表现。同时,还阐述了解析器的常用方法以及 BeautifulSoup 提取数据的常用方法,最后以爬取淘宝网首页为例,一步步呈现利用该库进行网页数据爬取的完整流程,助力读者掌握 BeautifulSoup 在数据解析与爬取方面的运用。

Python BeautifulSoup 库全解析:从解析器到网页数据爬取实战

  • BeautifulSoup解析数据
    • 安装方式
    • 解析器
      • 解析器的作用,什么是解析器
    • 解析器有哪些
    • 解析器的常用方法
    • beautifulsoup提取数据的常用方法
    • beautifulsoup爬取淘宝网首页
      • (第一步)导入requests库和beautifulsoup库
      • (第二步)设置url
      • (第三步)设置headers中的user-agent,模拟成浏览器访问
      • (第四步)使用requests.get获得并输出状态码 stauts_code,查看访问情况
      • (第五步)在淘宝网首页右键查看网页源代码,找到字符串编码,并设置encoding
      • (第六步)创建bs解析器
      • (第七步)获得a标签中的url,过滤None,只要完整的URL:

BeautifulSoup解析数据

是一个用于解析 HTML 和 XML 文档的 Python 库。它提供了简单又方便的函数来遍历、搜索和修改解析树,使得从网页中提取数据变得更加容易。

安装方式

pip install bs4
或者
conda install bs4

解析器

解析器的作用,什么是解析器

  1. 作用1:构建文档树结构,比如 一个HTML中,body标签下 有三个 div div下有ist,这种父子树形关系
  2. 作用2:获得标签的属性 比如通过筛选 a 标签 的class 为某些值,来获得需要的a标签

解析器有哪些

  1. 标准库(html.parser):内置库,速度始终,容错能力强
  2. lxml库(lxml):速度快 ,容错能力强
  3. xml库(html.xml):速度快,但是只支持xml
  4. html5(html5lib):容错能力最强可生成html5但是运行慢扩展差
    通过下面这段代码案例去测试不同解析器的作用:
from bs4 import BeautifulSoup
html_doc = '''
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>BeautifulSoup 解析器测试</title>
</head><body><h1 id="title">欢迎来到测试页面</h1><p class="content">这是一段测试内容。</p><p class="content">这里还有一段测试内容,包含一些特殊字符 &lt;&gt;&amp;</p><div><a href="https://www.example.com">示例链接</a></div><ul><li>项目 1</li><li>项目 2</li></ul><p>这是一个不规范的标签,缺少结束标签</p
</body></html>'''
# 使用 html.parser 解析
soup_html_parser = BeautifulSoup(html_doc, 'html.parser')
print("使用 html.parser 解析:")
print("标题:", soup_html_parser.find('h1').text)
print("第一个段落内容:", soup_html_parser.find('p', class_='content').text)
print("链接:", soup_html_parser.find('a')['href'])# 使用 lxml 的 HTML 解析器解析
soup_lxml_html = BeautifulSoup(html_doc, 'lxml')
print("\n使用 lxml 的 HTML 解析器解析:")
print("标题:", soup_lxml_html.find('h1').text)
print("第一个段落内容:", soup_lxml_html.find('p', class_='content').text)
print("链接:", soup_lxml_html.find('a')['href'])# 使用 html5lib 解析
soup_html5lib = BeautifulSoup(html_doc, 'html5lib')
print("\n使用 html5lib 解析:")
print("标题:", soup_html5lib.find('h1').text)
print("第一个段落内容:", soup_html5lib.find('p', class_='content').text)
print("链接:", soup_html5lib.find('a')['href'])# 尝试使用 lxml 的 XML 解析器(由于文档是 HTML,这里会报错)
try:soup_lxml_xml = BeautifulSoup(html_doc, 'html.xml')print("\n使用 html 的 XML 解析器解析:")print("标题:", soup_lxml_xml.find('h1').text)print("第一个段落内容:", soup_lxml_xml.find('p', class_='content').text)print("链接:", soup_lxml_xml.find('a')['href'])
except Exception as e:print("\n使用 html 的 XML 解析器解析出错:", e)

在这里插入图片描述
因为这个文档是lxml的格式下,所以在使用xml解析器会报错。

解析器的常用方法

大家直接看例子更为直观,直接上代码:

from bs4 import BeautifulSoup
html_doc = '''
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>BeautifulSoup 解析器测试</title>
</head><body><h1 id="title">欢迎来到测试页面</h1><p class="content bg" float = "left">这是一段测试内容。</p><p class="content">这里还有一段测试内容,包含一些特殊字符 &lt;&gt;&amp;</p><h2><!--这是html中的注释语法--></h2><div><a href="https://www.example.com">示例链接</a></div><ul><li>项目 1</li><li>项目 2</li></ul><p>这是一个不规范的标签,缺少结束标签</p
</body></html>'''# 使用 lxml 的 HTML 解析器解析
soup_lxml_html = BeautifulSoup(html_doc, 'lxml')
print(f"获取文章标签需要:{soup_lxml_html.title}")
print(f"获取标签中的文本内容需要.text:{soup_lxml_html.title.text}")
print(f"获取标签中的文本内容也可以需要.string.:{soup_lxml_html.title.string}")
print(f"但是二者是有区别的,string可以获取注释中的内容,而text不能,他只能获得正式的内容")
print(f"比如h2标签中的注释只可以通过string:{soup_lxml_html.h2.string}")
print(f"比如h2标签中的注释不可以通过text:{soup_lxml_html.h2.text}")print(f"获取文章标签所有属性列表需要attrs:{soup_lxml_html.p.attrs}")
print(f"获取某个标签的单个属性需要get:{soup_lxml_html.p.get('class')}")
print(f"获取某个标签的单个属性需要【】:{soup_lxml_html.p['class']}")

在这里插入图片描述

beautifulsoup提取数据的常用方法

  1. find(标签,属性):找到第一个满足要求的数据
  2. find_all(标签,属性);找到所有满足要求的数据
  3. select( css的ID 或者class 或者属性) :因为不知道大家是否有css的基础,这里我给大家详细解释一下 什么是 ID 就是制作网页的人通过自己定义的ID 赋予对应id的标签一个属性(属性里可能有字体 颜色 宽高 背景等等),这个属性不会被 class属性覆盖,因为他权重比较高,且ID不能重复用 。class也是属性,比如一个标签有多个属性,这些属性之间后者会覆盖前者(比如一个标签 里有 三个class 他们都设置了颜色,只会执行最后一个class的颜色)
    理论学完了,我们直接上代码,一目了然:
from bs4 import BeautifulSoup
html_doc = '''
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>BeautifulSoup 解析器测试</title>
</head><body><h1 id="title">欢迎来到测试页面</h1><p class="content bg" float = "left">这是一段测试内容。</p><p class="content">这里还有一段测试内容,包含一些特殊字符 &lt;&gt;&amp;</p><h2><!--这是html中的注释语法--></h2><div class = "qwer"><a href="https://www.example.com">示例链接1</a></div><div class = "asdf"><a href="https://www.example.com">示例链接2</a></div><ul><li id = "gb">项目 1</li><li>项目 2</li></ul><p>这是一个不规范的标签,缺少结束标签</p
</body></html>'''# 使用 lxml 的 HTML 解析器解析
soup_lxml_html = BeautifulSoup(html_doc, 'lxml')
print(f"find只可以找到第一个满足条件的{soup_lxml_html.find('p', class_='''content''')}")
print(f"findall可以找到所有满足条件的{soup_lxml_html.find_all('p',class_='''content''')}")print(f"找cssid属性需要select #:{soup_lxml_html.select('#gb')}")
print(f"找cssclass属性需要select .:{soup_lxml_html.select('.content')}")
print(f"根据层级关系找需要>{soup_lxml_html.select('div>a')}")
print(f"层级关系也可以设置class{soup_lxml_html.select('div.asdf>a')}")

在这里插入图片描述

beautifulsoup爬取淘宝网首页

(第一步)导入requests库和beautifulsoup库

import requests
from bs4 import BeautifulSoup

(第二步)设置url

注意:为了大家少出错养成一个好习惯,所有的字符串都要用三引号

url = '''https://www.taobao.com/'''

(第三步)设置headers中的user-agent,模拟成浏览器访问

这个user-agent,可以通过打开开发者工具F12或者右键检查的方式,任意抓包中找到user-agent复制过来用键值对的字典形式存储:
在这里插入图片描述

headers = {'user-agent':'''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'''}

(第四步)使用requests.get获得并输出状态码 stauts_code,查看访问情况

import requests
from bs4 import BeautifulSoup
url = '''https://www.taobao.com/'''
headers = {'user-agent':'''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'''}response = requests.get(url,headers = headers)
print(response.status_code)

在这里插入图片描述

(第五步)在淘宝网首页右键查看网页源代码,找到字符串编码,并设置encoding

在这里插入图片描述

response.encoding = '''utf-8'''

(第六步)创建bs解析器

bs = BeautifulSoup(response.text,'lxml')

(第七步)获得a标签中的url,过滤None,只要完整的URL:

import requests
from bs4 import BeautifulSoup
url = '''https://www.taobao.com/'''
headers = {'user-agent':'''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'''}response = requests.get(url,headers = headers)
response.encoding = '''utf-8'''
bs = BeautifulSoup(response.text,'lxml')
a_list = bs.find_all("a")
for a in a_list:url = a.get('href')if url == None:continueif url.startswith("http") or url.startswith("https"):print(url)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

架构06-分布式共识

零、文章目录 架构06-分布式共识 1、分布式共识 &#xff08;1&#xff09;基本概念 **分布式共识&#xff1a;**在分布式系统中&#xff0c;多个节点之间达成一致的过程。**复杂性来源&#xff1a;**网络的不可靠性和请求的并发性。**应用场景&#xff1a;**如何确保重要数…

linux基础病毒编写

linux目录介绍 /bin二进制可执行命令/etc系统管理和配置文件/etc/rc.d启动的配置文件和脚本 /home用户主目录的基点/lib标准程序设计库&#xff0c;又叫动态链接共享库 /sbin超级管理命令&#xff0c;这里存放的是系统管理员使用的管理程序 /tmp公共的临时文件存储点 /root系统…

使用Apache HttpClient上传文件

Apache HttpClient是一个强大且灵活的库&#xff0c;用于处理Java中的HTTP请求。 它支持多种HTTP方法&#xff0c;并能处理不同类型的请求体&#xff0c;包括文件上传。本 教程将演示如何使用Apache HttpClient来向服务器上传文件。 Maven依赖 要使用Apache HttpClient&…

uni-app写的微信小程序每次换账号登录时出现缓存上一个账号数据的问题

uni-app写的微信小程序每次更换另外账号登录时出现缓存上一个账号数据的问题&#xff1f; 1&#xff0c; 清除缓存数据&#xff1a;在 onShow 钩子中&#xff0c;我们将 powerStations、list 和 responseRoles 的值重置为初始状态&#xff0c;以清除之前的缓存数据。 2&…

初始Python篇(9)—— 函数

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 函数的定义及调用 函数的概念 函数的定义 函数的调用 水仙花数等自幂数的练习 函数相关参数的概念 函数的返回值 变…

【题解】—— LeetCode一周小结48

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结47 25.网络延迟时间 题目链接&#xff1a;743. 网络延迟时间 …

RK3568国产处理器 + TensorFlow框架的张量创建实验案例分享

一、实验目的 本节视频的目的是了解张量定义、了解张量的表示形式、并学习基于TensorFlow框架的张量创建方法。 二、实验原理. 张量定义 1、张量是多维数组&#xff0c;这个定义常见于各种人工智能软件。 2、张量是某种几何对象&#xff0c;不会随着坐标系的改变而改变。 3…

SpringMVC:SpringMVC的bean加载机制

问题分析 入门案例的内容已经做完了&#xff0c;在入门案例中我们创建过一个SpringMvcConfig的配置类&#xff0c;再回想前面咱们学习Spring的时候也创建过一个配置类SpringConfig。这两个配置类都需要加载资源&#xff0c;那么它们分别都需要加载哪些内容? 我们先来看下目前…

张伟楠动手学强化学习笔记|第一讲(上)

张伟楠动手学强化学习笔记|第一讲&#xff08;上&#xff09; 人工智能的两种任务类型 预测型任务 有监督学习无监督学习 决策型任务 强化学习 序贯决策(Sequential Decision Making) 智能体序贯地做出一个个决策&#xff0c;并接续看到新的观测&#xff0c;知道最终任务结…

Navicat连接SQL Server

Navicat连接SQL Server 安装自带的SQL Server客户端 去到Navicat安装目录&#xff0c;找到安装程序&#xff0c;安装即可。 安装对应版本的Microsoft ODBC Driver for SQL Server 打开Navicat输入对应的SQL Server相关信息 然后点测试连接&#xff0c;提示连接成功。

子模块、Fork、NPM 包与脚手架概述

子模块 在 Git 仓库中嵌套另一个仓库&#xff0c;通过引用的方式引入到主项目&#xff0c;版本管理依赖 Git 提交记录或分支&#xff0c;更新需手动拉取并提交&#xff0c;适用于共享代码并保持项目独立性。 优点&#xff1a;子模块支持直接查看和修改&#xff0c;保持子模块…

将一个数组逆序输出。-多语言

目录 C 语言实现 方法 1: 交换元素 方法 2: 使用辅助数组 方法 3: 使用递归 方法 4: 使用标准库函数&#xff08;C99及以上&#xff09; 总结 Python 实现 方法 1: 交换元素 方法 2: 使用切片 方法 3: 使用 reversed() 函数 方法 4: 使用 list.reverse() 方法 方法…

传智杯 A字符串拼接

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 键盘输入两个字符串&#xff0c;将这两个字符串进行拼接后输出。 输入描述: 键盘输入两个字符串 输出描述: 输出两个字符串拼接后的结果 示例1 输入 hello nihao 输出 helloni…

js高级-ajax封装和跨域

ajax简介及相关知识 原生ajax AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML&#xff0c;就是异步的 JS 和 XML。 通过 AJAX 可以在浏览器中向服务器发送异步请求&#xff0c;最大的优势&#xff1a;无刷新获取数据。 按需请求&#xff0c;可以提高网站的性能 AJ…

WEB开发: 丢掉包袱,拥抱ASP.NET CORE!

今天的 Web 开发可以说进入了一个全新的时代&#xff0c;前后端分离、云原生、微服务等等一系列现代技术架构应运而生。在这个背景下&#xff0c;作为开发者&#xff0c;你一定希望找到一个高效、灵活、易于扩展且具有良好性能的框架。那么&#xff0c;ASP.NET Core 显然是一个…

D82【python 接口自动化学习】- pytest基础用法

day82 pytest初体验 学习日期&#xff1a;20241128 学习目标&#xff1a;pytest基础用法 -- pytest初体验 学习笔记&#xff1a; 文件命名规范 py测试文件必须以test_开头&#xff08;或_test结尾&#xff09;测试方法必须以test开头测试类必须以Test开头&#xff0c;并且…

前端面试热门题(二)[html\css\js\node\vue)

Vue 性能优化的方法 Vue 性能优化的方法多种多样&#xff0c;以下是一些常用的策略&#xff1a; 使用v-show替换v-if&#xff1a;v-show是通过CSS控制元素的显示与隐藏&#xff0c;而v-if是通过操作DOM来控制元素的显示与隐藏&#xff0c;频繁操作DOM会导致性能下降。因此&am…

HarmonyOS4+NEXT星河版入门与项目实战(23)------实现手机游戏摇杆功能

文章目录 1、案例效果2、案例实现1、代码实现2、代码解释4、总结1、案例效果 2、案例实现 1、代码实现 代码如下(示例): import router from @ohos.router import {ResizeDirection } from @ohos.UiTest import curves

MySQL--视图

目录 1 认识视图 1.1 视图的定义 1.1 创建视图 1.2 查询 1.3 修改 1.4 删除 1.5 视图的优缺点 1.5.1 优点 1.5.2 缺点 1.6 视图的类型 1.7 视图与物化视图 2 视图检查选项 2.1 CASCADED 2.2 LOCAL 3 视图更新及作用 3.1 视图案列结合 3.1.1 屏蔽敏感数据 3.1…

【工具】JS解析XML并且转为json对象

【工具】JS解析XML并且转为json对象 <?xml version1.0 encodingGB2312?> <root><head><transcode>hhhhhhh</transcode></head><body><param>ccccccc</param><param>aaaaaaa</param><param>qqqq<…