Python BeautifulSoup4 入门使用

简介: Python BeautifulSoup4 入门使用

一、简介

  • 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>]
print(soup.select('li[class="c5 c6"]')) # [<li class="c5 c6">沈阳</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

相关文章
|
19天前
|
存储 数据挖掘 开发者
Python编程入门:从零到英雄
在这篇文章中,我们将一起踏上Python编程的奇幻之旅。无论你是编程新手,还是希望拓展技能的开发者,本教程都将为你提供一条清晰的道路,引导你从基础语法走向实际应用。通过精心设计的代码示例和练习,你将学会如何用Python解决实际问题,并准备好迎接更复杂的编程挑战。让我们一起探索这个强大的语言,开启你的编程生涯吧!
|
7天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
12天前
|
机器学习/深度学习 数据可视化 数据挖掘
使用Python进行数据分析的入门指南
本文将引导读者了解如何使用Python进行数据分析,从安装必要的库到执行基础的数据操作和可视化。通过本文的学习,你将能够开始自己的数据分析之旅,并掌握如何利用Python来揭示数据背后的故事。
|
22天前
|
机器学习/深度学习 数据可视化 数据挖掘
使用Python进行数据分析的入门指南
【10月更文挑战第42天】本文是一篇技术性文章,旨在为初学者提供一份关于如何使用Python进行数据分析的入门指南。我们将从安装必要的工具开始,然后逐步介绍如何导入数据、处理数据、进行数据可视化以及建立预测模型。本文的目标是帮助读者理解数据分析的基本步骤和方法,并通过实际的代码示例来加深理解。
35 3
|
23天前
|
JSON Linux 数据格式
Python模块:从入门到精通,只需一篇文章!
Python中的模块是将相关代码组织在一起的单元,便于重用和维护。模块可以是Python文件或C/C++扩展,Python标准库中包含大量模块,如os、sys、time等,用于执行各种任务。定义模块只需创建.py文件并编写代码,导入模块使用import语句。此外,Python还支持自定义模块和包,以及虚拟环境来管理项目依赖。
Python模块:从入门到精通,只需一篇文章!
|
8天前
|
IDE 程序员 开发工具
Python编程入门:打造你的第一个程序
迈出编程的第一步,就像在未知的海洋中航行。本文是你启航的指南针,带你了解Python这门语言的魅力所在,并手把手教你构建第一个属于自己的程序。从安装环境到编写代码,我们将一步步走过这段旅程。准备好了吗?让我们开始吧!
|
8天前
|
测试技术 开发者 Python
探索Python中的装饰器:从入门到实践
装饰器,在Python中是一块强大的语法糖,它允许我们在不修改原函数代码的情况下增加额外的功能。本文将通过简单易懂的语言和实例,带你一步步了解装饰器的基本概念、使用方法以及如何自定义装饰器。我们还将探讨装饰器在实战中的应用,让你能够在实际编程中灵活运用这一技术。
24 7
|
9天前
|
开发者 Python
Python中的装饰器:从入门到实践
本文将深入探讨Python的装饰器,这一强大工具允许开发者在不修改现有函数代码的情况下增加额外的功能。我们将通过实例学习如何创建和应用装饰器,并探索它们背后的原理和高级用法。
25 5
|
8天前
|
机器学习/深度学习 人工智能 算法
深度学习入门:用Python构建你的第一个神经网络
在人工智能的海洋中,深度学习是那艘能够带你远航的船。本文将作为你的航标,引导你搭建第一个神经网络模型,让你领略深度学习的魅力。通过简单直观的语言和实例,我们将一起探索隐藏在数据背后的模式,体验从零开始创造智能系统的快感。准备好了吗?让我们启航吧!
29 3
|
12天前
|
Python
Python编程入门:从零开始的代码旅程
本文是一篇针对Python编程初学者的入门指南,将介绍Python的基本语法、数据类型、控制结构以及函数等概念。文章旨在帮助读者快速掌握Python编程的基础知识,并能够编写简单的Python程序。通过本文的学习,读者将能够理解Python代码的基本结构和逻辑,为进一步深入学习打下坚实的基础。