Python的解析网页

课前案例

通过requests模块爬取指定网站中的图片并保存到本地目录中。

上述案例采用的是同步方式下载图片,效率太低。异步方式如下(线程):

复制代码
# target为目标函数;args中传入的是download函数的参数url
threading.Thread(target=download,args=(url,)).start()

注意: args为元组格式,如果传入一个参数注意后面必须跟着一个逗号;线程配置完毕之后记得调用start方法启动线程。

Beautiful Soup

什么是Beautiful Soup

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.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

快速入门

将课件资料中的index.html文件复制到python项目中即可。

解析数据

标签

每个tag都有自己的名字,通过soup.name来获取标签。

复制代码
# 获取p标签
p = soup.p
print(p)
# 获取title标签
title = soup.title
print(title)

**注意:**如果有多个相同的标签,则会返回第一个。

属性

一个标签可能有很多个属性。例如:标签 <b class="boldest"> 有一个 class 的属性,值为 boldest 。标签的属性的操作方法与字典相同。

  • 获取指定标签的单一属性,类似字典方式
复制代码
# 获取p标签的class属性
attrs = soup.p["class"]
print(attrs)

注意: 最常见的多值的属性是 class (一个标签可以有多个CSSclass). 还有一些属性 rel , rev , accept-charset , headers , accesskey . 在Beautiful Soup中多值属性的返回类型是list

  • 获取指定标签的单一属性,通过attrs方式
复制代码
# 通过attrs获取p标签的id属性
id_ = soup.p.attrs["id"]
print(id_)
  • 获取指定标签的所有属性:
复制代码
# 获取指定标签的所有属性
p_attrs = soup.p.attrs
print(p_attrs)
标签内容

通过.text.string获取标签节点的内容,也可以通过.strings获取标签节点下的所有内容。

复制代码
# 获取单个标签的内容
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)

注意:在使用.next_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选择器。在 TagBeautifulSoup 对象的 .select() 方法中传入字符串参数, 即可使用CSS选择器的语法找到标签:

复制代码
print(soup.select("title"))
print(soup.select("body div"))
print(soup.select("p.aa"))

3.综合案例

通过requestsBeautiful Soup4模块结合实现小说网站内容爬虫案例。

相关推荐
用户8356290780519 小时前
Python 实现 PDF 文件加密与解密方法
后端·python
用户8356290780519 小时前
使用 Python 冻结与拆分 Excel 窗格教程
后端·python
你好潘先生17 小时前
别再记命令了,用 yeero do 说句人话就能跑脚本,而且不烧 token
服务器·python·命令行
Agent_大师17 小时前
WebSocket 行情重连成功,K线缺口不会自动消失
python
荣码17 小时前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
copyer_xyf18 小时前
FastAPI 如何连接 MySQL
后端·python
apocelipes1 天前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
用户8356290780511 天前
使用 Python 在 PDF 中创建与管理书签
后端·python
MeixianAgent2 天前
Python 回测数据入口怎么验?历史 K 线入库前先做 5 个检查
后端·python
咕白m6252 天前
用 Python 实现一键批量查找与替换 Excel 数据
后端·python