Beautiful Soup应用示例

news/2024/12/4 3:54:50/

Beautiful Soup应用示例

简介

Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库,它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。

快速入门

from bs4 import BeautifulSoup
broken_html = '<ul class=country><li>Area<li>Population</ul>'
soup = BeautifulSoup(broken_html, 'lxml')
fixed_html = soup.prettify()
# <html>
#  <body>
#   <ul class="country">
#    <li>
#     Area
#    </li>
#    <li>
#     Population
#    </li>
#   </ul>
#  </body>
# </html>
print(fixed_html)
ul = soup.find('ul', attrs={'class': 'country'})
# <li>Area</li>
ul.find('li')
#[<li>Area</li>, <li>Population</li>]
ul.find_all('li')

安装Beautiful Soup

  1. Beautiful Soup 4通过PyPi发布,可以通过pip安装。
pip install beautifulsoup4
  1. 安装解析器,Beautiful Soup支持python标准库中的HTML解析器,还支持一些第三方的解析器,比如lxml和html5lib。
pip install lxml
pip install html5lib
  1. 解析器对比
解析器使用方法优势劣势
Python标准库BeautifulSoup(markup, "html.parser")Python的内置标准库,执行速度适中,文档容错能力强Python3.2.2前的版本中文档容错能力强
lxml HTML解析器BeautifulSoup(markup, "lxml")速度快,文档容错能力强需要安装C语言库
lxml XML解析器BeautifulSoup(markup, ["lxml-xml"])BeautifulSoup(markup, "xml")速度快,唯一支持XML的解析器需要安装C语言库
html5libBeautifulSoup(markup, "html5lib")最好的容错性,以浏览器的方式解析文档,生成HTML5格式的文档速度慢,不依赖外部扩展
  1. lxml的使用
import lxml.html as lh
broken_html = '<ul class=country><li>Area<li>Population</ul>'
tree = lh.fromstring(broken_html)
fixed_html = lh.tostring(tree, pretty_print=True)
# b'<ul class="country">\n<li>Area</li>\n<li>Population</li>\n</ul>\n'
print(fixed_html)

对象的种类

Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:TagNavigableStringBeautifulSoupComment

  1. Tag

(1)Tag对象与XML或HTML原生文档中的tag相同

soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
tag = soup.b
# bs4.element.Tag
type(tag)

(2)Tag有很多方法和属性,最重要的属性name和attributes

# 通过.name获取标签名, 'b'
tag.name
# 如果改变了tag的name,那将影响所有通过当前Beautiful Soup对象生成的HTML文档
tag.name = "blockquote"
# <blockquote class="boldest">Extremely bold</blockquote>
tag
# 一个tag可能有很多个属性,tag有一个class属性,['boldest']
tag['class']
# 也可以直接使用“点”取属性,{'class': ['boldest']}
tag.attrs
# tag的属性可以被添加,删除或修改,tag的属性操作方法与字典一样
tag['class'] = 'verybold'
tag['id'] = 1
# <blockquote class="verybold" id="1">Extremely bold</blockquote>
tag
del tag['class']
del tag['id']
# <blockquote>Extremely bold</blockquote>
tag
# 多值属性,HTML 4定义了一系列可以包含多个值的属性.在HTML5中移除了一些,却增加更多.最常见的多值的属性是class,在bs4中多值属性返回类型是list
css_soup = BeautifulSoup('<p class="body strikeout"></p>')
# ['body', 'strikeout']
css_soup.p['class']
# 将tag转换成字符串时,多值属性会合并为一个值
rel_soup = BeautifulSoup('<p>Back to the <a rel="index">homepage</a></p>')
# ['index']
rel_soup.a['rel']
rel_soup.a['rel'] = ['index', 'contents']
# <p>Back to the <a rel="index contents">homepage</a></p>
print(rel_soup.p)
  1. 可以遍历的字符串
# 字符串常被包含在tag内,NavigableString类用来包装tag中的字符串
soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
tag = soup.b
# 'Extremely bold'
tag.string
# bs4.element.NavigableString
type(tag.string)
# tag中包含的字符串不能编辑,但是可以使用replace_with()方法替换
tag.string.replace_with("No longer bold")
# <blockquote>No longer bold</blockquote>
tag
  1. BeautifulSoup对象表示的是一个文档的全部内容,大多数时候可以把它当做Tag对象,因为BeautifulSoup对象并不是真正的HTML或XML的tag,所以没有name和attribute属性。

  2. Tag,NavigableString,BeautifulSoup几乎覆盖了html和xml中的所有内容,但是还有一些特殊对象入文档的注释部分。Comment对象是一个特殊类型的NavigableString对象。

markup = "<b><!--Hey, buddy. Want to buy a used parser?--></b>"
soup = BeautifulSoup(markup)
comment = soup.b.string
'bs4.element.Comment'
type(comment)

http://www.ppmy.cn/news/100086.html

相关文章

Zabbix4.0 自动发现TCP端口并监控

java端口很多&#xff0c;每台机器上端口不固定&#xff0c;考虑给机器配置组不同的组挂载模版&#xff0c;相对繁琐。直接使用同一个脚本自动获取机器上java相关的端口&#xff0c;推送到zabbix-server。有服务端口挂了自动推送告警 一、zabbix-agent配置过程 1、用户自定义参…

ROS:ROS的一些基本命令行

目录 一、打开小海龟1.1终端&#xff0c;启动ROS Master&#xff1a;1.2终端2&#xff0c;启动小海龟仿真器&#xff1a;1.3终端3&#xff0c;启动海龟控制节点&#xff1a; 二、查看系统中的计算图三、节点命令3.1查看节点下的命令rosnode3.2显示节点列表rosnode list3.3查看节…

【PyQt5】指示灯显示

【PyQt5】指示灯显示 1、背景2、代码示例3、QtDesigner绘制 1、背景 利用Qt5写工业控制软件交互界面的时候&#xff0c;经常需要在界面上有指示灯功能。 例如下面的明暗表示串行端口的连接和断开。 我们本质是用Qt5的label文本标签来实现的&#xff0c;即通过设置标签的样式表…

Homebrew安装及换源

Homebrew安装 官方源安装 直接在Terminal下执行命令&#x1f451; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 安装命令可直接在&#x1f37a;Homebrew官网查找&#xff1a; The Missing Package Manag…

Java的IO

1. Java中有几种类型的流 按照流的方向&#xff1a;输入流&#xff08;inputStream&#xff09;和输出流&#xff08;outputStream&#xff09;。 按照实现功能分&#xff1a;节点流&#xff08;可以从或向一个特定的地方&#xff08;节点&#xff09;读写数据。如 FileReade…

ERP系统介绍

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、ERP系统概述&#xff1f;1.什么是ERP2.主流ERP系统介绍3.用友ERP4.部署用友ERP畅捷通T6软件系统环境要求4.用友ERP畅捷通T6软件用户管理4.用友ERP畅捷通T6软…

POI入门级操作excel文档的代码示例

本文介绍了使用Apache POI库操作文档的所有方法和代码示例。读者可以学习如何创建Excel文档、Sheet、行、单元格,以及如何设置单元格的值和样式,最后将Excel文档保存到磁盘上。使用POI操作Excel文件非常方便,本文详细介绍了这个过程中需要使用的类和方法,供读者参考使用。 …

CMakeLists

Top level CMakeLists.txt for CGAL-branchbuild message( “ CMake setup ” ) project(CGAL CXX C) Minimal version of CMake: if(WIN32) cmake_minimum_required(VERSION 2.8.6) else() cmake_minimum_required(VERSION 2.6.2) endif() option for branch build optio…