设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间19 现在时间19 缓存数据 “但愿有一日 爱你的人 眼里山明水净 你爱的人心里海阔天空”

“但愿有一日 爱你的人 眼里山明水净 你爱的人心里海阔天空” -- 海阔天空

查看: 264|回复: 0

Python 页面解析Beautiful Soup库的使用方法

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:232
  • 打卡月天数:0
  • 打卡总奖励:3550
  • 最近打卡:2025-04-08 16:28:38
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
442
主题
411
精华
0
金钱
4884
积分
913
注册时间
2023-1-4
最后登录
2025-4-8

发表于 2023-2-10 22:43:25 | 显示全部楼层 |阅读模式
1.Beautiful Soup库简介
  1. <strong>Beautiful Soup</strong> 简称 <strong>BS4</strong>(其中 4 表示版本号)是一个 Python 中常用的页面解析库,它可以从 HTML 或 XML 文档中快速地提取指定的数据。
复制代码
  1. 相比于之前讲过的 [code]lxml
复制代码
库,Beautiful Soup 更加简单易用,不像正则和 XPath 需要刻意去记住很多特定语法,尽管那样会效率更高更直接。[/code]
  1. 对大多数 Python 使用者来说,<strong>好用</strong>会比<strong>高效</strong>更重要。
复制代码
  1. <strong>Beautiful Soup</strong>库为第三方库,需要我们通过[code]pip
复制代码
命令安装:[/code]
  1. pip install bs4
复制代码
  1. <strong>BS4</strong> 解析页面时需要依赖文档解析器,所以还需要一个文档解析器。Python 自带了一个文档解析库 [code]html.parser
复制代码
, 但是其解析速度稍慢,所以我们结合上篇内容(Python 文档解析:lxml库的使用),安装
  1. lxml
复制代码
作为文档解析库:[/code]
  1. pip install lxml
复制代码
2.Beautiful Soup库方法介绍
  1. 使用 <strong>bs4</strong> 的初始化操作,是用文本创建一个 [code]BeautifulSoup
复制代码
对象,并指定文档解析器:[/code]
  1. from bs4 import BeautifulSoup

  2. html_str = '''
  3. <div>
  4.     <ul>
  5.         <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>
  6.         <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>
  7.         <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>
  8.     </ul>
  9. </div>
  10. '''
  11. soup = BeautifulSoup(html_str, 'lxml')
  12. # prettify()用于格式化输出HTML/XML文档
  13. print(soup.prettify())
复制代码
  1. <strong>bs4</strong> 提供了[code]find_all()
复制代码
  1. find()
复制代码
两个常用的查找方法它们的用法如下:[/code]
2.1 find_all()
  1. [code]find_all()
复制代码
方法用来搜索当前
  1. tag
复制代码
的所有子节点,并判断这些节点是否符合过滤条件,最后以列表形式将符合条件的内容返回,语法格式如下:[/code]
  1. find_all(name, attrs, recursive, text, limit)
复制代码
  1. <strong>参数说明:</strong>name:查找所有名字为 name 的 tag 标签,字符串对象会被自动忽略。attrs:按照属性名和属性值搜索 tag 标签,注意由于 class 是 Python 的关键字,所以要使用 “class_”。recursive:find_all() 会搜索 tag 的所有子孙节点,设置 recursive=False 可以只搜索 tag 的直接子节点。text:用来搜文档中的字符串内容,该参数可以接受字符串 、正则表达式 、列表、True。limit:由于 find_all() 会返回所有的搜索结果,这样会影响执行效率,通过 limit 参数可以限制返回结果的数量。
复制代码
  1. from bs4 import BeautifulSoup

  2. html_str = '''
  3. <div>
  4.     <ul>
  5.         <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>
  6.         <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>
  7.         <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>
  8.     </ul>
  9. </div>
  10. '''
  11. soup = BeautifulSoup(html_str, 'lxml')

  12. print(soup.find_all("li"))
  13. print(soup.find_all("a"))
  14. print(soup.find_all(text="Python"))
复制代码
  1. 上面程序使用 [code]find_all()
复制代码
方法,来查找页面中所有的
  1. <li></li>
复制代码
标签、
  1. <a></a>
复制代码
标签和
  1. "Python"
复制代码
字符串内容。[/code]
2.2 find()
  1. [code]find()
复制代码
方法与
  1. find_all()
复制代码
方法极其相似,不同之处在于
  1. find()
复制代码
仅返回第一个符合条件的结果,因此
  1. find()
复制代码
方法也没有
  1. limit
复制代码
参数,语法格式如下:[/code]
  1. find(name, attrs, recursive, text)
复制代码
  1. 除了和 [code]find_all()
复制代码
相同的使用方式以外,bs4
  1. find()
复制代码
方法提供了一种简写方式:[/code]
  1. soup.find("li")
  2. soup.li
复制代码
  1. 这两行代码的功能相同,都是返回第一个[code]<li></li>
复制代码
标签,完整程序:[/code]
  1. from bs4 import BeautifulSoup

  2. html_str = '''
  3. <div>
  4.     <ul>
  5.         <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>
  6.         <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>
  7.         <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>
  8.     </ul>
  9. </div>
  10. '''
  11. soup = BeautifulSoup(html_str, 'lxml')

  12. print(soup.li)
  13. print(soup.a)
复制代码
  1. 上面的程序会打印出第一个[code]<li></li>
复制代码
标签和第一个
  1. <a></a>
复制代码
标签。[/code]
2.3 select()
  1. <strong>bs4</strong> 支持大部分的 CSS 选择器,比如常见的标签选择器、类选择器、id 选择器,以及层级选择器。<strong>Beautiful Soup</strong> 提供了一个 [code]select()
复制代码
方法,通过向该方法中添加选择器,就可以在 HTML 文档中搜索到与之对应的内容。[/code]
  1. 应用如下:
复制代码
  1. from bs4 import BeautifulSoup

  2. html_str = '''
  3. <div>
  4.     <ul>
  5.         <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>
  6.         <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>
  7.         <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>
  8.     </ul>
  9. </div>
  10. '''
  11. soup = BeautifulSoup(html_str, 'lxml')
  12. #根据元素标签查找
  13. print(soup.select('body'))
  14. #根据属性选择器查找
  15. print(soup.select('a[href]'))
  16. #根据类查找
  17. print(soup.select('.web'))
  18. #后代节点查找
  19. print(soup.select('div ul'))
  20. #根据id查找
  21. print(soup.select('#web1'))
复制代码
  1. 更多方法及其详细使用说明,请参见官方文档:https://beautiful-soup-4.readthedocs.io/en/latest/
复制代码
3.代码实例
  1. 学会了 <strong>Beautiful Soup</strong> ,让我们试着改写一下上次的爬虫代码吧:
复制代码
  1. import os
  2. import sys
  3. import requests
  4. from bs4 import BeautifulSoup

  5. x = requests.get('https://www.csdn.net/')

  6. soup = BeautifulSoup(x.text, 'lxml')

  7. img_list = soup.select('img[src]')

  8. # 创建img文件夹
  9. os.chdir(os.path.dirname(sys.argv[0]))

  10. if not os.path.exists('img'):
  11.     os.mkdir('img')
  12.     print('创建文件夹成功')
  13. else:
  14.     print('文件夹已存在')

  15. # 下载图片
  16. for i in range(len(img_list)):
  17.     item = img_list[i]['src']
  18.     img = requests.get(item).content
  19.     if item.endswith('jpg'):
  20.         with open(f'./img/{i}.jpg', 'wb') as f:
  21.             f.write(img)
  22.     elif item.endswith('jpeg'):
  23.         with open(f'./img/{i}.jpeg', 'wb') as f:
  24.             f.write(img)
  25.     elif item.endswith('png'):
  26.         with open(f'./img/{i}.png', 'wb') as f:
  27.             f.write(img)
  28.     else:
  29.         print(f'第{i + 1}张图片格式不正确')
  30.         continue
  31.     print(f'第{i + 1}张图片下载成功')
复制代码
  1. 这就是本文的全部内容了,快去动手试试吧!
复制代码
到此这篇关于Python 页面解析Beautiful Soup库的使用的文章就介绍到这了,更多相关Python  Beautiful Soup库内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表