Python 页面解析Beautiful Soup库的使用方法
作者:小嗷犬 发布时间:2022-02-26 07:57:15
1.Beautiful Soup库简介
Beautiful Soup 简称 BS4(其中 4 表示版本号)是一个 Python 中常用的页面解析库,它可以从 HTML 或 XML 文档中快速地提取指定的数据。
相比于之前讲过的
lxml
库,Beautiful Soup 更加简单易用,不像正则和 XPath 需要刻意去记住很多特定语法,尽管那样会效率更高更直接。
对大多数 Python 使用者来说,好用会比高效更重要。
Beautiful Soup库为第三方库,需要我们通过
pip
命令安装:
pip install bs4
BS4 解析页面时需要依赖文档解析器,所以还需要一个文档解析器。
Python 自带了一个文档解析库html.parser
, 但是其解析速度稍慢,所以我们结合上篇内容(Python 文档解析:lxml库的使用),安装lxml
作为文档解析库:
pip install lxml
2.Beautiful Soup库方法介绍
使用 bs4 的初始化操作,是用文本创建一个
BeautifulSoup
对象,并指定文档解析器:
from bs4 import BeautifulSoup
html_str = '''
<div>
<ul>
<li class="web" id="0"><a href="www.python.org" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >Python</a></li>
<li class="web" id="1"><a href="www.java.com" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >Java</a></li>
<li class="web" id="2"><a href="www.csdn.net" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >CSDN</a></li>
</ul>
</div>
'''
soup = BeautifulSoup(html_str, 'lxml')
# prettify()用于格式化输出HTML/XML文档
print(soup.prettify())
bs4 提供了
find_all()
与find()
两个常用的查找方法它们的用法如下:
2.1 find_all()
find_all()
方法用来搜索当前tag
的所有子节点,并判断这些节点是否符合过滤条件,最后以列表形式将符合条件的内容返回,语法格式如下:
find_all(name, attrs, recursive, text, limit)
参数说明:
name:查找所有名字为 name 的 tag 标签,字符串对象会被自动忽略。attrs:按照属性名和属性值搜索 tag 标签,注意由于 class 是 Python 的关键字,所以要使用 “class_”。recursive:find_all() 会搜索 tag 的所有子孙节点,设置 recursive=False 可以只搜索 tag 的直接子节点。text:用来搜文档中的字符串内容,该参数可以接受字符串 、正则表达式 、列表、True。limit:由于 find_all() 会返回所有的搜索结果,这样会影响执行效率,通过 limit 参数可以限制返回结果的数量。
from bs4 import BeautifulSoup
html_str = '''
<div>
<ul>
<li class="web" id="0"><a href="www.python.org" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >Python</a></li>
<li class="web" id="1"><a href="www.java.com" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >Java</a></li>
<li class="web" id="2"><a href="www.csdn.net" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >CSDN</a></li>
</ul>
</div>
'''
soup = BeautifulSoup(html_str, 'lxml')
print(soup.find_all("li"))
print(soup.find_all("a"))
print(soup.find_all(text="Python"))
上面程序使用
find_all()
方法,来查找页面中所有的<li></li>
标签、<a></a>
标签和"Python"
字符串内容。
2.2 find()
find()
方法与find_all()
方法极其相似,不同之处在于find()
仅返回第一个符合条件的结果,因此find()
方法也没有limit
参数,语法格式如下:
find(name, attrs, recursive, text)
除了和
find_all()
相同的使用方式以外,bs4 为find()
方法提供了一种简写方式:
soup.find("li")
soup.li
这两行代码的功能相同,都是返回第一个
<li></li>
标签,完整程序:
from bs4 import BeautifulSoup
html_str = '''
<div>
<ul>
<li class="web" id="0"><a href="www.python.org" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >Python</a></li>
<li class="web" id="1"><a href="www.java.com" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >Java</a></li>
<li class="web" id="2"><a href="www.csdn.net" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >CSDN</a></li>
</ul>
</div>
'''
soup = BeautifulSoup(html_str, 'lxml')
print(soup.li)
print(soup.a)
上面的程序会打印出第一个
<li></li>
标签和第一个<a></a>
标签。
2.3 select()
bs4 支持大部分的 CSS 选择器,比如常见的标签选择器、类选择器、id 选择器,以及层级选择器。Beautiful Soup 提供了一个
select()
方法,通过向该方法中添加选择器,就可以在 HTML 文档中搜索到与之对应的内容。
应用如下:
from bs4 import BeautifulSoup
html_str = '''
<div>
<ul>
<li class="web" id="web0"><a href="www.python.org" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >Python</a></li>
<li class="web" id="web1"><a href="www.java.com" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >Java</a></li>
<li class="web" id="web2"><a href="www.csdn.net" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >CSDN</a></li>
</ul>
</div>
'''
soup = BeautifulSoup(html_str, 'lxml')
#根据元素标签查找
print(soup.select('body'))
#根据属性选择器查找
print(soup.select('a[href]'))
#根据类查找
print(soup.select('.web'))
#后代节点查找
print(soup.select('div ul'))
#根据id查找
print(soup.select('#web1'))
更多方法及其详细使用说明,请参见官方文档:
https://beautiful-soup-4.readthedocs.io/en/latest/
3.代码实例
学会了 Beautiful Soup ,让我们试着改写一下上次的爬虫代码吧:
import os
import sys
import requests
from bs4 import BeautifulSoup
x = requests.get('https://www.csdn.net/')
soup = BeautifulSoup(x.text, 'lxml')
img_list = soup.select('img[src]')
# 创建img文件夹
os.chdir(os.path.dirname(sys.argv[0]))
if not os.path.exists('img'):
os.mkdir('img')
print('创建文件夹成功')
else:
print('文件夹已存在')
# 下载图片
for i in range(len(img_list)):
item = img_list[i]['src']
img = requests.get(item).content
if item.endswith('jpg'):
with open(f'./img/{i}.jpg', 'wb') as f:
f.write(img)
elif item.endswith('jpeg'):
with open(f'./img/{i}.jpeg', 'wb') as f:
f.write(img)
elif item.endswith('png'):
with open(f'./img/{i}.png', 'wb') as f:
f.write(img)
else:
print(f'第{i + 1}张图片格式不正确')
continue
print(f'第{i + 1}张图片下载成功')
这就是本文的全部内容了,快去动手试试吧!
来源:https://blog.csdn.net/qq_63585949/article/details/126762330
猜你喜欢
- 前几天一直在寻找能够输出python函数运行时最大内存消耗的方式,看了一堆的博客和知乎,也尝试了很多方法,最后选择使用memory_prof
- 阅读上一篇:FrontPage2002简明教程五:css样式表的应用 用户可以快速和容易地创建图片库,以显示图片或图像。他们可以将图像添加到
- 笔主在做一个项目要生成一组随机有序的整型数字,并按行输出到文本文件使用,恰好开始学习Python3,遂决定直接使用Python3解决思路:与
- 前言神经网络在设置的神经网络足够复杂的情况下,可以无限逼近一段非线性连续函数,但是如果神经网络设置的足够复杂,将会导致过拟合(overfit
- list字符串元素排序需求:对list中的字符串按照首字母排序实现:list1 = ['as,jj,bk']for line
- 这篇文章主要介绍了基于Python实现扑克牌面试题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- 一.下载安装包1.安装网址https://www.jetbrains.com/pycharm/2.在导航栏输入网址回车3.点击 DOWNLO
- chat.html <html> <head><title>asp之家-简单聊天&l
- 现在的域名提供已经取消免费的url转发功能,而且我们一般主要用的是带www的域名,以前不带www的域名一般是做url转发跳转到带www的域名
- 失效的书签们我们日常浏览网站的时候,时不时会遇到些新奇的东西( 你懂的.jpg ),于是我们就默默的点了个收藏或者加书签。然而当我们面对成百
- 1,flask中内置的过滤器模板中常用方法:{#过滤器调用方式{{变量|过滤器名称}} #} <!-- safe过滤器,可
- 众所周知,在设计爬虫时,最麻烦的一步就是对网页元素进行分析,目前流行的网页元素获取的工具有BeautifulSoup,lxml等
- python 远程统计文件#!/usr/bin/python#encoding=utf-8import timeimport osimpor
- ASP页面延迟的两个简单方法 asp延时第一种 代码如下:<% Response.Buffer = Tr
- 在我们python中输入输出函数在程序中运用较为广泛,运算符常用于if判断的条件中,今天我来给大家讲解这两项概念.input输入和print
- 有时候我们需要判断某一个IP地址是否属于一个网段,以决定该用户能否访问系统.比如用户登录的IP是218.6.7.7,而我们的程序必须判断他是
- 107条javascript(js)常用的方法技巧,十分的实用,相信看了下面的这些js编程技巧和方法,能够给javascript初学者解决很
- Python的装饰器可以实现在代码运行期间修改函数的上下文, 即可以定义函数在执行之前进行何种操作和函数执行后进行何种操作, 而函数本身并没
- 删除单条记录 代码如下:id = saferequest("id") sql="
- 本文实例为大家分享了python实现比较文件内容异同的具体代码,供大家参考,具体内容如下import sysimport difflibim