当前位置: 首页 > news >正文

Beautiful Soup

什么是Beautiful Soup

官网推荐现在的项目使用BeautifulSoup4 (BeautifulSoup 4版本,简称为bs4)开发。bs4是一个HTML/XML的解析器,主要的功能是解析和提取HTML/XML数据。

bs4不仅支持CSS选择器,而且支持Python标准库中的HTML解析器,以及lxml的XML解析器。

bs4库将复杂的HTML文档转换成树结构(HTML DOM),这个结构中的每个节点都是一个Python对象,这些对象可以归纳为如下四种:

说明

bs4.element.Tag

表示HTML中的标签,最基本的信息组织单元。

bs4.element.NavigableString

表示HTML中标签的文本(非属性字符串)

bs4.BeautifulSoup

表示HTML DOM中的全部内容,支持遍历文档树和搜索文档树的大部分方法。

bs4.element.Comment

表示标签内字符串的注释部分,是一种特殊的NavigableString对象。

使用bs4的一般流程

安装所需的库

pip install lxml -i https://mirrors.aliyun.com/pypi/simple/
pip install bs4 -i https://mirrors.aliyun.com/pypi/simple/

解析过程

创建BeautifulSoup类的对象

def __init__(self, markup="", features=None, builder=None, parse_only=None, from_encoding=None, exclude_encodings=None, **kwargs)

markup表示要解析的文档字符串或者文件对象;

features表示解析器的名称;

builder参数表示指定的解析器;

from_encoding参数表示指定的编码格式;

exclude_encodings参数表示排除的编码格式。

例如:

from bs4 import BeautifulSoup soup = BeautifulSoup(html_doc, 'lxml')

bs4支持的解析器

目前,bs4支持的解析器包括Python标准库、lxml和html5lib,它们的优势和劣势的比较如下。

解析器

使用方法

优势

劣势

Python标准库

BeautifulSoup(markup, "html.parser")

1Python的内置标准库

2)执行速度适中

3)文档容错能力强

Python 2.7.33.2.2之前的版本中文档容错能力差

lxml HTML解析器

BeautifulSoup(markup, "lxml")

1)速度快

2)文档容错能力强

需要安装C语言库

lxml XML解析器

BeautifulSoup(markup, ["lxml-xml"])

1)速度快

2)唯一支持XML的解析器

需要安装C语言库

html5lib

BeautifulSoup(markup, "html5lib")

1)最好的容错性

2)以浏览器的方式解析文档

3)生成HTML5格式的文档

1)速度慢

2)不依赖外部扩展

在创建BeautifulSoup对象时,如果没有明确地指定解析器,那么BeautifulSoup对象会根据当前系统安装的库自动选择解析器,解析器的选择顺序为:

lxml》html5lib》Python标准库

要解析的html字符串

<html> <head> <title>测试数据</title> <p> <title>内嵌的标题</title> </p> </head> <body> <p id="link"></p> <p id="u1"> <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a> <a href="http://example.com/elsie" class="sister" id="link2">Elsie</a> <a href="http://example.com/elsie" class="sister" id="link3">Elsie</a> <a href="http://example.com/elsie" class="sister" id="link4">Elsie</a> <b> <a href="http://tieba.baidu.com" class="Lacie" id="link5">Elsie</a> </b> </p> <div class="bri"> <p class="bri"></p> <a class="bri">Lacie</a> <span>通过api之find_all查找
import re from bs4 import BeautifulSoup from pathlib import Path # 创建 Path 对象 file_path = Path('test.html') soup = BeautifulSoup(file_path.read_text("utf-8"), "html.parser") print("----","打印文档树","----") print(soup) print("----","打印格式化文档树","----") print(soup.prettify()) # find_all(self, name=None, attrs={}, recursive=True, text=None,limit=None, **kwargs) # 传入字符串 print("----","传入字符串","----") result_set = soup.find_all("b") print(result_set) # 传入正则 print("----","传入正则","----") for tag in soup.find_all(re.compile("^b")): print(tag.name) # 传入列表 print("----","传入列表","----") r = soup.find_all(["a", "b"]) print(r) # 传入属性 print("----","传入属性","----") r = soup.find_all(id='link1') print(r) # 传入多个属性 print("----","传入多个属性","----") r = soup.find_all(href=re.compile("elsie"), id='link1') print(r) # 识别不了特殊的属性 print("----","识别不了特殊的属性","----") #r = soup.find_all(data-foo="pig") r = soup.find_all(attrs={"data-foo": "pig"}) print(r) # 传入class标签 print("----","传入class属性","----") r = soup.find_all("a", class_="sister") print(r) # 传入text print("----","传入text","----") r = soup.find_all(string="Elsie") print(r) # 传入多个text print("----","传入多个text","----") r = soup.find_all(string=["Tillie", "Elsie", "Lacie"]) print(r) # limit 参数 print("----","limit 参数","----") r = soup.find_all("a", limit=2) print(r) # recursive参数:如果只想搜索当前节点的直接子节点,那么就可以使用参数recursive=False。 print("----","recursive参数=true","----") r = soup.html.find_all("title") print(r) print("----","recursive参数=false","----") r = soup.html.find_all("title", recursive=False) print(r)

css选择器查找

import re from bs4 import BeautifulSoup from pathlib import Path # 创建 Path 对象 file_path = Path('test.html') bs = BeautifulSoup(file_path.read_text("utf-8"), "html.parser") #print(bs.prettify()) # css选择器 # (1)通过标签名查找 print("----","通过标签a查找","----") print(len(bs.select('a'))) print("----","通过组合标签p a查找","----") print(len(bs.select("p a"))) print("----","通过组合标签p>a查找","----") print(len(bs.select('p>a'))) # (2)通过类名查找 print("----","通过类名sister查找","----") print(len(bs.select('.sister'))) # (3)通过id查找 print("----","通过id=u1查找","----") print(bs.select('#u1')) # (4)组合查找 print("----","组合查找----") print(bs.select('div .bri')) # (5)属性查找 print("----","通过class属性查找","----") print(bs.select('a[class~="bri"]')) print("----" ,"通过属性href查找","----") print(bs.select('a[href="http://tieba.baidu.com"]')) # (6)获取文本内容 print("----" ,"获取文本内容","----") print(bs.select('title')[0].get_text())

比较Find_all()与select()

作用

Find_all()

Select()

筛选出所有a标签

soup.find_all('a')

soup.select('a')

筛选出class属性是footer的标签

soup.find_all(class_'=footer')

soup.select('.footer')

筛选出id属性是linkp标签

soup.find_all('p', id='link')

soup.select('p[id="link"]')

筛选出head标签下的title标签

soup.head.find_all('title')

孙子title也会被找出来

soup.select('head > title')

筛选出超链接属性是”www.baidu.com”a标签

soup.find_all('a',href='www.baidu.com')

soup.select('a[href="www.baidu.com"]')

import re from bs4 import BeautifulSoup from pathlib import Path # 创建 Path 对象 file_path = Path('test.html') soup = BeautifulSoup(file_path.read_text(), "html.parser") r=soup.find_all('p', id='link') print(r) r=soup.select('p[id="link"]') print(r) r=soup.head.find_all('title') print(r) r=soup.select('head > title') print(r)
http://www.jsqmd.com/news/611538/

相关文章:

  • 跨平台协同:Windows主机+Mac笔记本共享Qwen3-32B-Chat镜像方案
  • internlm2-chat-1.8b开源模型深度解析:SFT+RLHF对齐带来的指令遵循提升
  • 配电系统里充电站怎么报价才能既赚到钱又不被市场机制反噬?这问题最近折腾得我够呛。今天咱们就扒一扒这个两阶段投标策略的代码实现,保证您看完能自己动手写个简化版
  • Z-Image-Turbo-辉夜巫女实战教程:GPU算力弹性伸缩——按需加载LoRA模型
  • S2-Pro辅助3D建模与场景描述:连接自然语言与Blender脚本生成
  • 2026年知名的组合式中空锚杆/隧道支护中空锚杆稳定供应商推荐 - 品牌宣传支持者
  • 手把手教你用社区预编译轮子在 Windows 上快速安装 flash_attn(含常见错误解决方案)
  • 卡证检测模型固件升级:嵌入式设备模型OTA更新
  • NestJS 系列教程(十八):文件上传与对象存储架构(Multer + S3/OSS + 访问控制)
  • Vue实战:从零构建黑马后台管理系统全流程解析
  • [特殊字符] 第72课:杨辉三角
  • 2026年热门的隧道支护中空注浆锚杆/自钻式中空注浆锚杆/螺纹钢中空注浆锚杆/预应力中空注浆锚杆口碑好的厂家推荐 - 品牌宣传支持者
  • Sambert多情感语音合成保姆级教程:从部署到生成你的第一段语音
  • 逆变器核心技术解析:锁相环(PLL)在并网系统中的应用与优化
  • Verilog中pullup和pulldown的实战应用:从I2C到Open-Drain的完整指南
  • 基于PyTorch 2.8 的代码生成实践:使用Codex模型辅助编写深度学习脚本
  • 2026年知名的电渗析高盐水处理设备/垃圾渗滤液高盐水处理设备/冷冻法高盐水处理设备/撬装式高盐水处理设备源头厂家 - 品牌宣传支持者
  • 基于Simulink的无差拍(Deadbeat)电流控制高动态性能
  • Java 接入多家大模型 API 实战对比
  • Phi-4-reasoning-vision-15B在研发协作中的应用:代码IDE截图理解与问题定位
  • 算术运算符(i++与++i)
  • 保姆级教程:用Ollama一键部署Qwen2.5-VL-7B,零基础体验看图说话AI
  • GLM-OCR入门指南:理解‘稳定全任务强化学习’在OCR微调阶段的实际作用
  • Debian12下Rime输入法配置全攻略:从ibus安装到雾凇拼音自动部署
  • 从直觉到算法:贝叶斯思维的技术底层与工程实现督
  • ChatGPT爬虫请求量已超Googlebot 3.6倍,为什么你的内容还是没被AI搜索引用?
  • 手把手教你用Python和MATLAB生成标准SVS文件(从numpy数组到多级金字塔)
  • [特殊字符] 第73课:打家劫舍
  • Local SDXL-Turbo案例集:从简单提示词到复杂场景的生成效果
  • 常见软件安装失败