freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Python爬虫基础-Beautiful Soup简介
micdy 2025-03-03 10:47:33 51063
所属地 四川省

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语言库
html5libBeautifulSoup(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标签的内容
# 爬虫 # Python爬虫
本文为 micdy 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
micdy LV.2
这家伙太懒了,还未填写个人描述!
  • 3 文章数
  • 0 关注者
PWN栈溢出基础-ret2csu
2025-03-03
Python-Spider 爬虫基础
2025-03-03
文章目录