当前位置: 首页 > 工具软件 > BeautifulSoup > 使用案例 >

python BeautifulSoup的使用

司徒兴思
2023-12-01

1.BeautifulSoup简介

Beautiful Soup 提供一些简单的、python 式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。 Beautiful Soup 自动将输入文档转换为 Unicode 编码,输出文档转换为 utf-8 编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup 就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。 Beautiful Soup 已成为和 lxml、html6lib 一样出色的 python 解释器,为用户灵活地提供不同的解析策略或强劲的速度。

官方文档:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/

2. Beautiful Soup 安装

pip install beautifulsoup4
pin install lxml # lxml解析库

Beautiful Soup 支持 Python 标准库中的 HTML 解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python 会使用 Python 默认的解析器,lxml 解析器更加强大,速度更快,推荐安装。

Python 标准库:BeautifulSoup(html_doc, “html.parser”)

  • Python 的内置标准库
  • 执行速度适中
  • 文档容错能力强
  • Python 2.7.3 or 3.2.2) 前 的版本中文档容错能力差

lxml HTML 解析器 :BeautifulSoup(html_doc, “lxml”)

  • 速度快
  • 文档容错能力强
  • 需要安装 C 语言库

lxml XML 解析器:BeautifulSoup(html_doc, “xml”)

  • 速度快
  • 唯一支持 XML 的解析器
  • 需要安装 C 语言库

html5lib:BeautifulSoup(html_doc, “html5lib”)

  • 最好的容错性
  • 以浏览器的方式解析文档
  • 生成 HTML5 格式的文档
  • 速度慢
  • 不依赖外部扩展

3. 创建 Beautiful Soup 对象

# 导入 bs4 库
from bs4 import BeautifulSoup

# 字符串示例

html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>

<p class="title"><b>The Dormouse's story</b></p>
<p class="story">...</p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

"""

# 创建 beautifulsoup 对象
# 默认bs4会调用系统中的lxml解析库,也可以主动设置bs4的解析库
soup = BeautifulSoup(html_doc,'lxml') # 设置解析库为 lxml

4. 常用方法

# 格式化输出
result=soup.prettify()

# 取title标签
result=soup.title

# 取title标签名
result=soup.title.name

# 取title标签内容,若标签下有多个内容时,返回None
result=soup.title.string

# 取title标签内容,若标签下有多个内容时,全部返回
result=soup.title.get_text()

# 取p标签,只会取第一个
result=soup.p

# 取p标签的类
result=soup.p['class']

# 取a标签(第一个)
result=soup.a

# 取a标签的href属性
result=soup.a['href']

# find -- 返回符合查询条件的第一个标签
# 指定标签名
result=soup.find(name="a") # 同 soup.find("a")

# 指定属性
result=soup.find(attrs={'id':'link1'})

# 指定内容
result=soup.find(text='Elsie')

# 组合条件
result=soup.find(
    name='p',
    attrs={'class':'story'}
    )


#find_all --list
result=soup.find_all('a') # 取出所有a标签

result=soup.find_all('a',limit=2) # limit限制返回标签数

result=soup.find_all(attrs={'class':'sister'}) # 取出所有属性 class为sister的标签

result=soup.a.attrs # 获取a标签的所有属性

result=soup.select_one('.sister') # 取出class为sister的第一个标签


# ### CSS选择器 -- list

result=soup.select('.sister') # 类选择器,取出所有class为siser的标签

result=soup.select('#link1') # id选择器,取出所有id为link1的标签

result=soup.select('head title') # 取head标签中的title标签

result=soup.select('title,.title') # 取title标签 和 class为title的标签

result=soup.select('a[id="link2"]') # 取 a标签中 id为link2的标签

# # 标签包裹的内容 
result=soup.select('.sister')[0].get_text() # 取class为sister的第一个标签的内容

# # 标签的属性
result=soup.select('.sister')[1].get('href') # 取class为siser的第二个标签的href属性

print(result)
print(type(result))
 类似资料: