Python中的BS4模块-Beautiful Soup

Python的BS4库用于从HTML和XML文件中提取数据,提供方便的文档导航和查找功能。安装BS4时推荐使用lxml解析器以提高效率。BS4的核心包括四大对象:Tag、Attribute、NavigableString和Comment。通过.tag属性获取Tag的名字,.attrs获取属性信息,可以使用属性定位和CSS选择器进行元素定位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是BS4?

是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.

BS4的安装

pip install beautifulsoup4

BS4的导入

from bs4 import BeautifulSoup

BS4的解析器

解析器使用方法优势劣势
Python标准库BeautifulSoup(markup, “html.parser”)Python的内置标准库,执行速度快,文档容错能力强Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差
lxml HTML 解析器BeautifulSoup(markup, “lxml”)速度快,文档容错能力强需要安装C语言库
lxml XML 解析器BeautifulSoup(markup, [“lxml-xml”])速度快,唯一支持xml的解析器需要安装C语言库
html5libBeautifulSoup(markup, “html5lib”)最好的容错性,以浏览器的方式速度慢,不依赖外部拓展

在官方文档中推荐使用lxml作为解析器,因为效率更高。在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必须安装lxml或html5lib, 因为那些Python版本的标准库中内置的HTML解析方法不够稳定.

创建BeautifulSoup对象

#导入BS4的包
from bs4 import BeautifulSoup
#创建BeautifulSoup对象
#这里的html是爬取到的网页,"lxml"指的是选择器
soup = BeautifulSoup(html,"lxml")

BS中的四大对象

对象属性
Tag是html中的一个标签,用BeautifulSoup就能解析出来Tag的具体内容,具体的格式为soup.name,其中name是html下的标签。
BeautifulSoup整个html文本对象,可当作Tag对象.
NavigableString标签内的文本对象
Comment是一个特殊的NavigableString对象,如果html标签内存在注释,那么它可以过滤掉注释符号保留注释文本

Tag属性的介绍

Tag对象:

from bs4 import BeautifulSoup


#创建一段html标签
html = '''
    <b class="boldest">Extremely bold</b>
    <ul>
        <li>li</li>
    </ul>
'''
soup = BeautifulSoup(html,"lxml")
#创建一个tag对象
tag = soup.b
print(type(tag))


#>>> 此处获取的就是b标签
#    <b class="boldest">Extremely bold</b>
#    <class 'bs4.element.Tag'

.name属性:每一个tag对象都有自己的名字,通过.name来获取

from bs4 import BeautifulSoup


#创建一段html标签
html = '''
    <b class="boldest">Extremely bold</b>
    <ul>
        <li>li</li>
    </ul>


'''
soup = BeautifulSoup(html,"lxml")
#创建一个tag对象
tag = soup.b
tag_name = tag.name
#打印出tag对象的名字
print(tag_name)
#打印出tag对象名字的类型
print(type(tag_name))
#>>> b
#    <class 'str

更改tag.name的属性

	soup = BeautifulSoup(html,"lxml")
	#创建一个tag对象
	tag = soup.b
	#更改tag.name的值
	tag.name = "genggai"
	#过去tag,name
	tag_name = tag.name
	#打印出tag对象的名字
	print(tag_name)
	#打印出tag对象名字的类型
	print(type(tag_name))
	#>>> genggai
	#    <class 'str'>

如果改变了tag的name,那将影响所有通过当前Beautiful Soup对象生成的HTML文档

attrs

attrs:像字典一样获取标签中的属性信息,attrs返回类型是字典类型

#创建一段html标签
html = '''
    <b class="boldest" id="di1">Extremely bold</b>
    <ul>
        <li>li</li>
    </ul>


'''
soup = BeautifulSoup(html,"lxml")
#创建一个tag对象
tag = soup.b
#获取tag中所有的信息
tag_dict = tag.attrs
#打印出attrs的值
print(tag_dict)
#打印出attrs返回的类型
print(type(tag_dict))
#>>>  {'class': ['boldest'], 'id': 'di1'}
#      <class 'dict'

属性定位

  • soup.find(“tagName”,attrName=“value”):定位属性值tagName中attrName="value"的第一个标签
from bs4 import BeautifulSoup


html = """
  <div class="boldest" id="di1">Extremely bold</div>
    <ul>
        <div class="boldest">没有id的div</div>
        <li>li</li>
    </ul>
"""


soup = BeautifulSoup(html,"lxml")
div_data = soup.find("div",class_="boldest")
print(div_data)
#只取到了第一个class值为boldest的标签
#>>>    <div class="boldest" id="di1">Extremely bold</div
  • soup.find_all(“tagName”,attrName=“value”):定位属性值tagName中attrName="value"的所有标签,返回值是一个集合
from bs4 import BeautifulSoup


html = """
  <div class="boldest" id="di1">Extremely bold</div>
    <ul>
        <div class="boldest">没有id的div</div>
        <li>li</li>
    </ul>
"""


soup = BeautifulSoup(html,"lxml")
div_data = soup.find_all("div",class_="boldest")
print(div_data)
#>>> [<div class="boldest" id="di1">Extremely bold</div>, <div class="boldest">没有id的div</div

选择器定位

  • soup.select(“css选择器”):定位css选择器选中的标签,返回值是一个列表
from bs4 import BeautifulSoup


html = """
<div class="boldest" id="di1">Extremely bold</div>
    <ul>
        <div class="boldest">没有id的div</div>
        <li>li</li>
    </ul>


"""


soup = BeautifulSoup(html,"lxml")
# #di1选择id为di1的标签
div_data = soup.select("#di1")
print(div_data)
#>>>[<div class="boldest" id="di1">Extremely bold</div
  • 层级选择器:

类似于xpath中的/,只是在bs4中用>来表示,跨节点用空格表示,只不过bs4一定有一个层级的开始

from bs4 import BeautifulSoup


html = """
<div class="boldest" id="di1">Extremely bold
    <ul>
        <div class="boldest">没有id的div</div>
        <li>li1</li>
        <li>li2</li>
    </ul>
</div>
"""


soup = BeautifulSoup(html,"lxml")
#层级选择器空格举例
data = soup.select("#di1 li")
# 取id为di1的标签下面ul标签里面li标签
div_data = soup.select("#di1 > ul > li")
print(div_data)
#两个取值的结果都是一样的
#>>>[<li>li1</li>, <li>li2</li>]
#>>>[<li>li1</li>, <li>li2</li>]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值