Python爬虫基础-Beautiful Soup简介

2025-03-07 11 0

Beautiful Soup 是 Python 的一个第三方库,主要用于从 HTML 或 XML 文件中提取数据,它提供了简单的函数用来处理导航、搜索、修改分析树等功能。
简介文档
Beautiful Soup 4.4.0 文档 — beautifulsoup 4.4.0q 文档

安装Beautiful Soup

pip install beautifulsoup4
pip install bs4

Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,仅仅需要说明一下原始编码方式就可以了。

Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,这里推荐使用第三方的解释器lxml。
安装lxml

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

Beautiful Soup 对象

创建Beautiful Soup对象

from bs4 import BeautifulSoup
bs = BeautifulSoup(html,"lxml")

Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象。

Tag

Tag对象就是HTML的一个个标签,例如 <div><title>
获取Tag对象

bs = BeautifulSoup(html,"lxml")
print(bs.title)

注:相同的标签只能获取第一个符合要求的标签

获取标签的属性

soup = BeautifulSoup(html, 'lxml')
# 获取所有属性
print(soup.div.attrs)

# 获取单个属性
print(soup.div["class"])
print(soup.div.get("float"))
print(soup.a["href"])

NavigableString

NavigableString是Beautiful Soup库中的一个类,它用于表示 HTML 或 XML 标签内的文本内容。简单来说,当你解析一个 HTML 文档时,标签中间的纯文本部分会被封装成NavigableString对象。

可以直接将NavigableString对象当作字符串来使用,例如打印内容或进行字符串操作。

soup = BeautifulSoup(html, 'lxml')
print(soup.title.string) # 提取可用内容
print(soup.title.text) # 解析标签

print(type(soup.title.string))
# -> <class 'bs4.element.NavigableString'> ,如果存在注释,则为<class 'bs4.element.Comment'>对象

print(type(soup.title.text))
# -> <class 'str'>

NavigableStringstr的子类,这意味着它继承了str的大部分属性和方法。同时,它也可以作为标签对象的一部分,存在于文档树结构中。一个标签对象可以包含多个NavigableString对象和其他子标签。

注:当一个标签内包含多个子标签时,tag.string可能会返回None,这时可以使用 get_text()获取标签中的所有内容。

Comment

在 Python 的Beautiful Soup库中,Comment对象是用于处理 HTML 或 XML 文档中的注释内容的特殊对象,是NavigableString的子类。
Beautiful Soup能够识别出文档中的注释部分,并将其封装为Comment对象,以便与普通的文本内容区分开来。可以通过检查对象的类型来判断是否为注释。
可以像访问NavigableString对象一样访问Comment对象的内容,直接打印或进行字符串操作。

可以使用replace_with()方法来修改注释的内容,使用extract()方法来删除注释。

comment.replace_with('<!-- ' + new_comment + ' -->')
print(soup.prettify())
comment.extract()
print(soup.prettify())

在一些特别情景,需要对注释进行顾虑时

from bs4.element import Comment

if type(soup.strong.string) == Comment:
    print(soup.strong.prettify())
else:
    print(soup.strong.string) 

Beautiful Soup方法

find_all() 搜索文档树

find_all方法可以传递多种参数,搜索的返回值为一个列表。

find_all(name=None, attrs={}, recursive=True, string=None, limit=None, **kwargs)
  • name:可以是标签名(字符串类型)、正则表达式、列表、True 或者自定义函数,用于指定要查找的标签名称。默认为 None,表示查找所有标签。

  • attrs:一个字典,用于指定标签的属性和属性值,只有具有这些属性和对应值的标签才会被匹配。

  • recursive:布尔值,默认为 True。如果设置为 True,则会递归地在所有子标签中查找;如果设置为 False,则只在直接子标签中查找。

  • string:可以是字符串、正则表达式、列表等,用于匹配标签内的文本内容。

  • limit:整数类型,用于限制返回结果的数量。如果设置了该参数,当找到指定数量的匹配项后,就会停止搜索。

  • **kwargs:可以直接通过关键字参数来指定标签的属性,例如 id='main'表示查找 id属性为 main的标签。

# 传递字符串
print(soup.find_all("div")) # 返回所有的div标签

# 通过标签id查找
print(soup.find_all(id='title')) # 返回所有id为title的标签

# 通过标签属性查找
print(soup.find_all(class_="info")) # 返回所有属性为info的标签,因为class不能用作变量名,所以使用class_

# 传入字典,也可组合其他参数使用
print(soup.find_all(attrs={'float':'left'})) # 根据字典的键值匹配返回相应的标签
print(soup.find_all("div", attrs={"class": "info"})) # 返回标签属性为info的div标签

# 使用正则表达式查找
print(soup.find_all(re.compile("^div"))) # 查找以div开头的标签
print(soup.find_all(re.compile("^a"))) # 查找以a开头的标签

# 根据文本查找
print(soup.find_all('p', string=lambda text: 'text' in text if text else False)) # 在p标签中查找包含text的p标签

# limit可以限制返回标签的数量
print(soup.find_all("div", limit=2)) # 只返回查找到的前两个两个div标签

# 传入列表,匹配符合列表元素的标签返回
print(soup.find_all(['div', 'span'])) # 返回所有的div和span标签

# 将recursive设置为Fasle,可以直接在子标签中查找。
print(soup.find_all('p', recursive=False))

select css选择器

select()方法允许你使用 CSS 选择器来查找 HTML 或 XML 文档中的元素。CSS 选择器是一种强大的模式匹配工具,提供了简洁且灵活的方式来定位文档中的特定元素。

soup.select(css_selector)
表达式 说明
tag 选择指定标签
* 选择所有节点
#id 选择id为container的节点
.class 选取所有class包含container的节点
li a 选取所有li下的所有a节点
ul + p (兄弟)选择ul后面的第一个p元素
div#id > ul (父子)选取id为id的div的第一个ul子元素
table ~ div 选取与table相邻的所有div元素
a[title] 选取所有有title属性的a元素
a[class=”title”] 选取所有class属性为title值的a
a[href*=”sxt”] 选取所有href属性包含sxt的a元素
a[href^=”http”] 选取所有href属性值以http开头的a元素
a[href$=”.png”] 选取所有href属性值以.png结尾的a元素
input[type="redio"]:checked 选取选中的hobby的元素
# 标签选择器,传入css标签
print(soup.select("div")) # 返回所有的div标签

# id选择器,添加#表示id
print(soup.select("#title")) # 返回所有id为title的标签

# 类选择器,. 表示类
print(soup.select(".info")) # 返回所有类属性为info的标签

# 属性选择器,[]来指定属性语属性值
print(soup.select("a[herf^='www']")) # 返回以www开头的带herf链接的a标签
print(soup.select("div[class='info']")) # 返回属性为info的div标签

# 子选择器,以 > 来表示子标签
print(soup.select("div > span")) # 返回div所包含的span子标签

# 后代选择器,以空格分离
print(soup.select("div span")) # 返回div标签中包含的所有span子标签

# 组合选择
print(soup.select("div.info > a")) # 返回属性为info的div标签包含的a子标签

# 通过css选择器获取标签的信息
print(soup.select("div.info > a")[0].get('href')) # 获取a标签的属性
print(soup.select("div.info > a")[0].text) # 获取a标签的内容

4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

恶意软件伪装成合法 Go 库感染Linux和macOS用户 | CSO Online
PWN栈溢出基础-ret2csu
【验证码逆向专栏】某盾 v2 滑动验证码逆向分析
探秘条件漏洞:系统安全的潜在隐患
记录某SRC邀请处逻辑越权到组织管理员漏洞
DNSTwist 使用指南

发布评论