课前案例
如果不存在imgs目录,则需要手动创建它,或者通过代码创建。可以使用 Path.mkdir()
方法创建目录。例如:
imgs_dir = Path("imgs")
imgs_dir.mkdir(parents=True, exist_ok=True)
记得下载 lxml软件包,可以在终端用指令下载:
pip install -i https://mirrors.aliyun.com/pypi/simple/ lxml
Beautiful Soup
解析器
Beautiful Soup
支持Python
标准库中的HTML解析器,还支持一些第三方的解析器:
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
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"])``BeautifulSoup(markup, "xml") | 速度快唯一支持XML的解析器 | 需要安装C语言库 |
html5lib | BeautifulSoup(markup, "html5lib") | 最好的容错性以浏览器的方式解析文档生成HTML5格式的文档 | 速度慢不依赖外部扩展 |
安装与配置
# 安装requests模块
pip install requests==2.10.0
# 安装beautiful soup4
pip install bs4
# 安装lxml解析器
pip install lxml
解析数据
每个tag都有自己的名字,通过soup.name
来获取标签。
# 获取p标签
p = soup.p
print(p)
# 获取title标签
title = soup.title
print(title)
属性
-
获取指定标签的单一属性,类似字典方式
# 获取p标签的class属性
attrs = soup.p["class"]
print(attrs)
-
获取指定标签的单一属性,通过
attrs
方式
# 通过attrs获取p标签的id属性
id_ = soup.p.attrs["id"]
print(id_)
-
获取指定标签的所有属性:
-
# 获取指定标签的所有属性
p_attrs = soup.p.attrs
print(p_attrs)
标签内容
# 获取单个标签的内容
text = soup.p.text
print(text)
print(soup.p.string)
# 获取该标签下所有的内容,返回generator生成器
strings = soup.div.strings
for st in strings:
print(st)
遍历文档树
子节点
# tag小技巧获取层级子节点
print(soup.body.div.p)
.contents
:将标签的子节点以列表的方式输出
# 获取div标签下的所有子节点
print(soup.body.div.contents)
# 获取div标签下的第二个子节点
print(soup.body.div.contents[1])
# 获取div标签下的第二个子节点的标签名
print(soup.body.div.contents[1].name)
# 获取div标签下的第二个子节点的所有属性
print(soup.body.div.contents[1].attrs)
.children
:对标签的子节点进行循环
# 获取div下的的子节点
children = soup.body.div.children
print(children)
# 循环打印节点信息
for child in children:
print(child)
.descendants
:对所有标签的子孙节点进行递归循环
descendants = soup.body.descendants
for des in descendants:
print(des)
父节点
.parent
:获取某个元素的父节点
print(soup.p.parent)
.parents
:递归得到元素的所有父辈节点
parents = soup.p.parents
for p in parents:
print(p)
兄弟节点
.next_sibling
:获取下级单个兄弟节点
print(soup.p.next_sibling.next_sibling)
.previous_sibling
:获取上级单个兄弟节点
print(soup.body.previous_sibling.previous_sibling)
搜索文档树
find
find方法,语法格式如下:
find( name , attrs , recursive , string , **kwargs )
参数说明:
参数 | 说明 |
---|---|
name | 需要查找的标签名,可以是字符串、正则表达式、列表或True |
attrs | 需要查找的标签的属性,可以是字典类型或关键字参数 |
recursive | 是否递归地搜索子标签,默认为True ,即会搜索所有子孙标签 |
string | 需要查找的标签中包含的文本内容 |
kwargs | 其他属性条件 |
通过find
方法搜索指定的标签。
print(soup.find('p', class_="aa")) print(soup.find('p', class_="aa", id="username"))
注意:class类样式的处理。
True
可以匹配任何值,如下示例返回第一个节点:
print(soup.find(True))
更多内容请查看官网。
find_all
find_all()
方法的基本语法如下:
find_all(name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)
参数说明:
参数 | 说明 |
---|---|
name | 需要查找的标签名,可以是字符串、正则表达式、列表或True |
attrs | 需要查找的标签的属性,可以是字典类型或关键字参数 |
recursive | 是否递归地搜索子标签,默认为True ,即会搜索所有子孙标签 |
text | 需要查找的标签中包含的文本内容 |
limit | 限制返回的结果数量,可以传入一个整数值 |
返回值:
-
如果找到满足条件的元素,则返回一个包含这些元素的列表。
-
如果未找到满足条件的元素,则返回一个空列表。
find_add
方法搜索当前标签下所有子节点,并判断是否符合过滤器的条件。
all = soup.find_all('p') for a in all: print(a) print(soup.find_all(["p", "input"]))
更多内容请查看官网。
css选择器
Beautiful Soup
支持大部分的CSS
选择器。在 Tag
或 BeautifulSoup
对象的 .select()
方法中传入字符串参数, 即可使用CSS
选择器的语法找到标签:
print(soup.select("title")) print(soup.select("body div")) print(soup.select("p.aa"))标签:网页,Python,标签,find,soup,print,div,解析,节点 From: https://blog.csdn.net/2301_80332388/article/details/139203999