Python BeautifulSoup4 入门使用

news2025/7/12 9:34:04

一、简介

  • BeautifulSoup4lxml 一样,是一个 html 解析器,主要功能也是解析和提取数据。

  • BeautifulSoup4爬虫 必学的技能。BeautifulSoup 最主要的功能是从网页抓取数据,Beautiful Soup 自动将输入文档转换为 Unicode 编码,输出文档转换为 utf-8 编码,不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup 就不能自动识别编码方式了,然后,仅仅需要说明一下原始编码方式就可以了。

  • BeautifulSoup 支持 Python 标准库中的 HTML 解析器,还 支持一些第三方的解析器,如果不安装它,则 Python 会使用 Python 默认的解析器。

  • 使用步骤

    # 1、安装
    $ pip install bs4
    
    # 2、导入
    from bs4 import BeautifulSoup
    
    # 3、创建对象
    soup = beautifulsoup(解析内容,解析器)
    
    # 服务器响应文件生成对象(注意编码格式)
    soup = BeautifulSoup(response.read().decode('utf-8'), 'lxml')
    # 本地文件生成对象(注意编码格式)
    soup = BeautifulSoup(open('test.html', 'r', encoding='utf-8'), 'lxml')
    
  • 常用解析器:html.parserlxmlxmlhtml5lib,其中 lxml 解析器更强大,速度更快,推荐使用 lxml 解析器,附 beautifulsoup 菜鸟教程。

    # 如果解释器不存在,则需要进行安装,其他解释器也一样
    $ pip install lxml
    

    请添加图片描述

二、案例

  • 列举一下比较常用的几个方法 find()、find_all()、select(),推荐使用 select() 支持选择器写法,还有一些属性的基本获取,更多的方法知道使用在查就行了,懒的列。

  • 本地测试数据

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8"/>
      <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
      <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
      <title>Document</title>
    </head>
    <body>
      <div>
        <ul>
          <li id="l1" class="c1">北京</li>
          <li id="l2" class="c2">上海</li>
          <li id="l3">深圳</li>
          <li id="l4" title="dzm">武汉</li>
          <a href="" id="xlwb">新浪微博</a>
          <span>哈哈哈</span>
        </ul>
      </div>
      <ul>
        <li>大连</li>
        <li>沈阳</li>
        <li>长沙</li>
      </ul>
      <a href="" id="bdyx">百度一下</a>
    </body>
    </html>
    
  • 本地测试代码

    # 导入
    from bs4 import BeautifulSoup
    
    # 本地文件生成对象
    soup = BeautifulSoup(open('test.html', 'r', encoding='utf-8'), 'lxml')
    
    # 根据标签名查找节点 
    # 找到第一个符合条件的节点返回
    print(soup.a) # <a href="" id="xlwb">新浪微博</a>
    
    # 获取标签的属性和属性值
    print(soup.a.attrs) # {'href': '', 'id': 'xlwb'}
    
    
    
    
    
    # soup.find():返回单个对象
    
    
    # 根据 title 值来找到对应的标签对象
    print(soup.find('li', title="dzm")) # <li id="l4" title="dzm">武汉</li>
    
    # 根据 class 值来找到对应的标签对象
    # print(soup.find('li', class="c1")) # 关键字 class 存在 python 中会报错无法使用
    print(soup.find('li', class_="c1")) # 可以通过加下划线来使用属于系统关键字的属性 <li class="c1" id="l1">北京</li>
    
    
    
    
    
    # soup.find_all():返回数组
    
    
    # 查找所有 a 标签
    print(soup.find_all('a')) # [<a href="" id="xlwb">新浪微博</a>, <a href="" id="bdyx">百度一下</a>]
    
    # 查找所有 a | span 标签
    print(soup.find_all(['a', 'span'])) # [<a href="" id="xlwb">新浪微博</a>, <span>哈哈哈</span>, <a href="" id="bdyx">百度一下</a>]
    
    # limit 限制查找数量,查找前几个数据
    print(soup.find_all('li', limit=2)) # [<li class="c1" id="l1">北京</li>, <li class="c2" id="l2">上海</li>]
    
    
    
    
    
    #【推荐使用】soup.select():返回数组,制成选择器写法
    
    
    # 查找所有 a 标签
    print(soup.select('a')) # [<a href="" id="xlwb">新浪微博</a>, <a href="" id="bdyx">百度一下</a>]
    
    # 查找所有 a | span 标签
    print(soup.select('a,span')) # [<a href="" id="xlwb">新浪微博</a>, <span>哈哈哈</span>, <a href="" id="bdyx">百度一下</a>]
    
    # 【类选择器】
    # 查找 class 属性为 c2 的标签
    print(soup.select('.c2')) # [<li class="c2" id="l2">上海</li>]
    # 查找 id 属性为 l3 的标签
    print(soup.select('#l3')) # [<li id="l3">深圳</li>]
    
    # 【属性选择器】
    # 查找 li 标签中有 id 的标签
    print(soup.select('li[id]')) # [<li class="c1" id="l1">北京</li>, <li class="c2" id="l2">上海</li>, <li id="l3">深圳</li>, <li id="l4" title="dzm">武汉</li>]
    print(soup.select('li[id="l2"]')) # [<li class="c2" id="l2">上海</li>]
    
    # 【后代选择器】
    # 找到 div 下的 li
    print(soup.select('div li')) # [<li class="c1" id="l1">北京</li>, <li class="c2" id="l2">上海</li>, <li id="l3">深圳</li>, <li id="l4" title="dzm">武汉</li>]
    
    # 【子代选择器】
    # print(soup.select('div>ul>li')) # 这种格式的,空格写不写都行
    print(soup.select('div > ul > li')) # [<li class="c1" id="l1">北京</li>, <li class="c2" id="l2">上海</li>, <li id="l3">深圳</li>, <li id="l4" title="dzm">武汉</li>]
    
    
    
    
    
    
    # 【推荐使用】节点属性
    
    # 获取节点内容(注意:标签对象中只有内容,那么下面两个都行,如果标签对象中还包含其他标签,那么 string 就获取不到了)
    # 推荐使用 get_text()
    print(soup.select('span')[0].string) # 哈哈哈
    print(soup.select('span')[0].get_text()) # 哈哈哈
    
    # 获得节点
    obj = soup.select('#xlwb')[0] # <a href="" id="xlwb">新浪微博</a>
    # 标签名称
    print(obj.name) # a
    # 标签属性json
    print(obj.attrs) # {'href': '', 'id': 'xlwb'}
    # 获取属性值
    print(obj.attrs['id']) # xlwb
    print(obj.attrs.get('id')) # xlwb
    print(obj.get('id')) # xlwb
    print(obj['id']) # xlwb
    

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

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

相关文章

Verilog语言中case、casex、casez的用法和区别

casez与casex语句是case语句的两种变体, 在写testbench时用到。case 语句是一种多路条件分支的形式&#xff0c;可以解决 if 语句中有多个条件选项时使用不方便的问题。 一、case、casex、casez的区别 下表给出case、casex、casez的真值表&#xff1a; 1&#xff09;在case语…

【计算机网络实验】防火墙访问控制列表实验

实验内容 防火墙访问控制列表实验 实验目的 理解访问控制列表的工作原理&#xff1b;了解访问控制列表的类型&#xff1b;学习标准访问控制列表的配置。 实验要求 1 实验拓扑图 本实验所用的网络拓扑如图1所示。 图1 ACL实验拓扑结构 2 实验步骤 Router0配置&#xff1b;&…

解决 npm install express 遇到的问题总结

方法1&#xff1a;权限 以管理员身份运行cmd执行npm install express --save命令 方法2&#xff1a;切换镜像源 查看镜像源 npm config get registry 如果要直接更换淘宝&#xff1a;npm config set registry https://registry.npmmirror.com/ 使用nrm切换 1.安装nrm npm i …

106362-34-9,(D-Ala1)-Peptide T amide

肽t的有效类似物DAPTA (aSTTTNYT-amide)在单核/巨噬细胞中显示出很强的抗hiv - 1活性&#xff0c;该肽抑制病毒的进入。 编号: 110545中文名称: 肽T、(D-Ala1)-Peptide T amide英文名: (D-Ala1)-Peptide T amideCAS号: 106362-34-9单字母: H2N-DAla-STTTNYT-NH2三字母: H2N-DAl…

设计模式 — 抽象工厂模式

抽象工厂模式女娲的失误实例 一实例 二抽象工厂模式的应用抽象工厂模式的优点抽象工厂模式的缺点抽象工厂模式的使用场景抽象工厂模式的注意事项女娲的失误 女娲造人的故事。人是造出来了&#xff0c;世界也热闹了&#xff0c;可是低头一看&#xff0c;都是清一色的类型&#…

Spark框架概述

Spark 框架概述 1.1. Spark是什么 定义&#xff1a;Apache Spark是用于大规模数据处理的统一分析引擎。 弹性分布式数据集RDD是一种分布式内存抽象&#xff0c;其使得程序员能够在大规模集群中做内存运算&#xff0c;并且有一定的容错方式。而这也是整个Spark的核心数据结构…

体验静态代码块

定义 public class Game {// 静态代码块static {System.out.println("static...run...");}// 构造方法public Game() {System.out.println("game...construct...");} }使用 结论 静态代码块在类被首次加载的时候触发启动

效能优化实践:C/C++单元测试万能插桩工具

研发效能是一个涉及面很广的话题&#xff0c;它涵盖了软件交付的整个生命周期&#xff0c;涉及产品、架构、开发、测试、运维&#xff0c;每个环节都可能影响顺畅、高质量地持续有效交付。在腾讯安全平台部实际研发与测试工作中我们发现&#xff0c;代码插桩隔离是单元测试工作…

theos tweak导入自定义类

有时&#xff0c;我们使用tweak的时候需要用到自定义的类&#xff0c;那么怎么引用呢&#xff1f; 假设我们有一个自定义类&#xff0c;people.h/people.m 那么分两种情况&#xff1a; 情况一&#xff0c;直接使用官方的tweak工程&#xff1a; 目录结构一般如下&#xff1a; …

[第九篇]——Docker 镜像使用

Docker 镜像使用 当运行容器时&#xff0c;使用的镜像如果在本地中不存在&#xff0c;docker 就会自动从 docker 镜像仓库中下载&#xff0c;默认是从 Docker Hub 公共镜像源下载。 下面我们来学习&#xff1a; 1、管理和使用本地 Docker 主机镜像2、创建镜像列出镜像列表 …

蛋白纯化-实验设计

小 M 不怕纯化“难”&#xff0c;IP、WB 只等闲。泡了两年实验室的小 M&#xff0c;理论与实操经验共有&#xff0c;且看我如何闯过蛋白纯化的几道“关”。 第一关 产品选择 小 M 敲黑板&#xff1a;此关最基础也最重要&#xff0c;谨防“一步错&#xff0c;步步错”。 亲和层析…

jenkins+junit4+allure+selenium实现自动化测试与结果可视化

安装包 jenkins.war jdk-8u332-linux-x64.tar.gz https://repo1.maven.org/maven2/io/qameta/allure/allure-commandline/2.17.2/ allure-commandline-2.17.2.zip https://chromedriver.storage.googleapis.com/index.html chromedriver 安装JDK 解压 tar xvf…

优盘数据恢复如何操作?恢复U盘数据的三个简单方法

对于我们用户来说&#xff0c;经常使用U盘来存储一些重要的文件是很常见的事。很多用户在使用的时候&#xff0c;经常因为操作不规范&#xff0c;而造成一些数据丢失。那么我们该如何做呢&#xff1f;优盘数据恢复如何操作&#xff1f;今天小编就来为大家分享一下关于如何将U盘…

基于梯度的图像边缘检测

参考视频&#xff1a;https://www.bing.com/videos/search?qacomputationalapproachtoedgedetection&docid608014236869751913&mid8C04384FFDD6A47533238C04384FFDD6A4753323&viewdetail&FORMVIRE 参考文献&#xff1a;A Computational Approach to Edge Dete…

【图像去噪】基于空间光谱总变化减少高光谱图像的混合噪声(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

线程的“打断”

【打断线程的三个方法】&#xff1a; //Thread.java public void interrupt() //t.interrupt() 打断t线程&#xff08;设置t线程某给标志位ftrue&#xff0c;并不是打断线程的运行&#xff09; public boolean isInterrupted() //t.isInterrupted() 查询打…

线程池源码解析 1.前导_FutureTask源码解析

线程池—FutureTask源码解析 简介 在学习线程池之前&#xff0c;需要先学习一下 FutureTask&#xff0c;因为线程池 submit 的结果就是 FutureTask。 那么什么是 FutureTask&#xff0c;其表示一个未来的任务。也就是说这个任务比较耗时&#xff0c;当前调用线程会阻塞拿到这…

某程序员发现 CSDN官方“漏洞”,立省¥10000+,抓紧薅吧

是一个省钱的组织&#xff01;&#xff01;&#xff01;它叫做勤学会&#xff0c;CSDN 官方背书。 打开这篇博客&#xff0c;你首先就要面对一个问题。 勤学会到底是什么&#xff1f;活动&#xff1f;社区&#xff1f;还是一个名词。 今天这篇博客就从解释【勤学会】这三个字开…

【Wins+VSCode】配置C++开发环境

目录1、安装vscode2、安装中文包和c扩展包3、安装c编译工具&#xff1a;g4、运行代码测试5、lauch.json6、tasks.json7、问题7.1、找不到gcc任务Reference1、安装vscode 官网下载就可以了&#xff0c;免费的&#xff1a; https://code.visualstudio.com/ 2、安装中文包和c扩展…

【Java项目】讲讲我用Java爬虫获取LOL英雄数据与图片(附源码)

&#x1f680;用Java爬一下英雄联盟数据 &#x1f4d3;推荐网站(不断完善中)&#xff1a;个人博客 &#x1f4cc;个人主页&#xff1a;个人主页 &#x1f449;相关专栏&#xff1a;CSDN专栏 &#x1f3dd;立志赚钱&#xff0c;干活想躺&#xff0c;瞎分享的摸鱼工程师一枚 &…