一、简介

  • BeautifulSoup4lxml 一样,是一个 html 解析器,主要功能也是解析和提取数据。

  • BeautifulSoup4爬虫 必学的技能。BeautifulSoup 最主要的功能是从网页抓取数据,Beautiful Soup 自动将输入文档转换为 Unicode 编码,输出文档转换为 utf-8 编码,不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup 就不能自动识别编码方式了,然后,仅仅需要说明一下原始编码方式就可以了。

  • BeautifulSoup 支持 Python 标准库中的 HTML 解析器,还 支持一些第三方的解析器,如果不安装它,则 Python 会使用 Python 默认的解析器。

  • 使用步骤

    # 1、安装
    $ pip install bs4# 2、导入
    from bs4 import BeautifulSoup# 3、创建对象
    soup = beautifulsoup(解析内容,解析器)# 服务器响应文件生成对象(注意编码格式)
    soup = BeautifulSoup(response.read().decode('utf-8'), 'lxml')
    # 本地文件生成对象(注意编码格式)
    soup = BeautifulSoup(open('test.html', 'r', encoding='utf-8'), 'lxml')
    
  • 常用解析器:html.parserlxmlxmlhtml5lib,其中 lxml 解析器更强大,速度更快,推荐使用 lxml 解析器,附 beautifulsoup 菜鸟教程。

    # 如果解释器不存在,则需要进行安装,其他解释器也一样
    $ pip install lxml
    

二、案例

  • 列举一下比较常用的几个方法 find()、find_all()、select(),推荐使用 select() 支持选择器写法,还有一些属性的基本获取,更多的方法知道使用在查就行了,懒的列。

  • 本地测试数据

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Document</title>
    </head>
    <body><div><ul><li id="l1" class="c1">北京</li><li id="l2" class="c2">上海</li><li id="l3">深圳</li><li id="l4" title="dzm">武汉</li><a href="" id="xlwb">新浪微博</a><span>哈哈哈</span></ul></div><ul><li>大连</li><li>沈阳</li><li>长沙</li></ul><a href="" id="bdyx">百度一下</a>
    </body>
    </html>
    
  • 本地测试代码

    # 导入
    from bs4 import BeautifulSoup# 本地文件生成对象
    soup = BeautifulSoup(open('test.html', 'r', encoding='utf-8'), 'lxml')# 根据标签名查找节点
    # 找到第一个符合条件的节点返回
    print(soup.a) # <a href="" id="xlwb">新浪微博</a># 获取标签的属性和属性值
    print(soup.a.attrs) # {'href': '', 'id': 'xlwb'}# soup.find():返回单个对象# 根据 title 值来找到对应的标签对象
    print(soup.find('li', title="dzm")) # <li id="l4" title="dzm">武汉</li># 根据 class 值来找到对应的标签对象
    # print(soup.find('li', class="c1")) # 关键字 class 存在 python 中会报错无法使用
    print(soup.find('li', class_="c1")) # 可以通过加下划线来使用属于系统关键字的属性 <li class="c1" id="l1">北京</li># soup.find_all():返回数组# 查找所有 a 标签
    print(soup.find_all('a')) # [<a href="" id="xlwb">新浪微博</a>, <a href="" id="bdyx">百度一下</a>]# 查找所有 a | span 标签
    print(soup.find_all(['a', 'span'])) # [<a href="" id="xlwb">新浪微博</a>, <span>哈哈哈</span>, <a href="" id="bdyx">百度一下</a>]# limit 限制查找数量,查找前几个数据
    print(soup.find_all('li', limit=2)) # [<li class="c1" id="l1">北京</li>, <li class="c2" id="l2">上海</li>]#【推荐使用】soup.select():返回数组,制成选择器写法# 查找所有 a 标签
    print(soup.select('a')) # [<a href="" id="xlwb">新浪微博</a>, <a href="" id="bdyx">百度一下</a>]# 查找所有 a | span 标签
    print(soup.select('a,span')) # [<a href="" id="xlwb">新浪微博</a>, <span>哈哈哈</span>, <a href="" id="bdyx">百度一下</a>]# 【类选择器】
    # 查找 class 属性为 c2 的标签
    print(soup.select('.c2')) # [<li class="c2" id="l2">上海</li>]
    # 查找 id 属性为 l3 的标签
    print(soup.select('#l3')) # [<li id="l3">深圳</li>]# 【属性选择器】
    # 查找 li 标签中有 id 的标签
    print(soup.select('li[id]')) # [<li class="c1" id="l1">北京</li>, <li class="c2" id="l2">上海</li>, <li id="l3">深圳</li>, <li id="l4" title="dzm">武汉</li>]
    print(soup.select('li[id="l2"]')) # [<li class="c2" id="l2">上海</li>]
    print(soup.select('li[class="c5 c6"]')) # [<li class="c5 c6">沈阳</li>]# 【后代选择器】
    # 找到 div 下的 li
    print(soup.select('div li')) # [<li class="c1" id="l1">北京</li>, <li class="c2" id="l2">上海</li>, <li id="l3">深圳</li>, <li id="l4" title="dzm">武汉</li>]# 【子代选择器】
    # print(soup.select('div>ul>li')) # 这种格式的,空格写不写都行
    print(soup.select('div > ul > li')) # [<li class="c1" id="l1">北京</li>, <li class="c2" id="l2">上海</li>, <li id="l3">深圳</li>, <li id="l4" title="dzm">武汉</li>]# 【推荐使用】节点属性# 获取节点内容(注意:标签对象中只有内容,那么下面两个都行,如果标签对象中还包含其他标签,那么 string 就获取不到了)
    # 推荐使用 get_text()
    print(soup.select('span')[0].string) # 哈哈哈
    print(soup.select('span')[0].get_text()) # 哈哈哈# 获得节点
    obj = soup.select('#xlwb')[0] # <a href="" id="xlwb">新浪微博</a>
    # 标签名称
    print(obj.name) # a
    # 标签属性json
    print(obj.attrs) # {'href': '', 'id': 'xlwb'}
    # 获取属性值
    print(obj.attrs['id']) # xlwb
    print(obj.attrs.get('id')) # xlwb
    print(obj.get('id')) # xlwb
    print(obj['id']) # xlwb
    

Python BeautifulSoup4 入门使用相关推荐

  1. python编程入门与案例详解-quot;Python小屋”免费资源汇总(截至2018年11月28日)...

    原标题:"Python小屋"免费资源汇总(截至2018年11月28日) 为方便广大Python爱好者查阅和学习,特整理汇总微信公众号"Python小屋"开通29 ...

  2. Python爬虫入门教程:博客园首页推荐博客排行的秘密

    1. 前言 虽然博客园注册已经有五年多了,但是最近才正式开始在这里写博客.(进了博客园才知道这里面个个都是人才,说话又好听,超喜欢这里...)但是由于写的内容都是软件测试相关,热度一直不是很高.看到首 ...

  3. python爬虫入门练习:BeautifulSoup爬取猫眼电影TOP100排行榜,pandas保存本地excel文件

    传送门:[python爬虫入门练习]正则表达式爬取猫眼电影TOP100排行榜,openpyxl保存本地excel文件 对于上文使用的正则表达式匹配网页内容,的确是有些许麻烦,替换出现任何的差错都会导致 ...

  4. Python爬虫入门学习例子之煎蛋网(福利哦)

    初学Python爬虫,学习资料是这篇博客:Python爬虫入门教程 经过前边两个例子(糗事百科爬虫和百度贴吧爬虫)的学习,我自己写了一个练习的例子:爬煎蛋网的妹子图,福利哦(*^__^*) #煎蛋网爬 ...

  5. python爬虫入门教程(二):开始一个简单的爬虫

    2019/10/28更新 使用Python3,而不再是Python2 转载请注明出处:https://blog.csdn.net/aaronjny/article/details/77945329 爬 ...

  6. python数据分析要学什么_python数据分析学什么?python数据分析入门

    有很多没有基础的新手想学习python数据分析,却在纠结python数据分析难不难学?下面万古网校小编给大家整理了资料,为各位分享! 1.python难不难? Python可以说是目前比较主流而且易学 ...

  7. Python培训入门基础知识学什么?

    Python培训基础知识主要是针对一些零基础的同学安排的,虽说Python是相对比较简单的一门编程语言,但是没有基础的同学还是要进行系统的学习,那么Python培训入门基础知识学什么呢?来看看下面小编 ...

  8. Python从入门到精通 - 入门篇 (下)

    上一讲回顾:Python从入门到精通 - 入门篇 (上) 接着上篇继续后面两个章节,函数和解析式. 4 函数 Python 里函数太重要了 (说的好像在别的语言中函数不重要似的).函数的通用好处就不用 ...

  9. python爬虫入门教程--优雅的HTTP库requests(二)

    requests 实现了 HTTP 协议中绝大部分功能,它提供的功能包括 Keep-Alive.连接池.Cookie持久化.内容自动解压.HTTP代理.SSL认证等很多特性,下面这篇文章主要给大家介绍 ...

最新文章

  1. VMware虚拟机三种网络模式(桥接、NAT、仅主机)的区别
  2. Android模拟器Genymotion安装apk
  3. 计算机专业的大学生自我介绍,计算机专业大学生自我介绍
  4. 双系统引导修复与引导项删除
  5. JavaScript函数节流(throttle)与函数去抖(debounce)解析与应用举例
  6. mysql双节点安装_快速安装及配置MySQL Replication双主节点集群--及改变数据保存目录...
  7. oracle装了客户端怎么登陆账号,分享Oracle 11G Client 客户端安装步骤(图文详解)...
  8. matchers依赖_Hamcrest Matchers的高级创建
  9. C++中 模板Template的使用
  10. Unity3D 渲染管线全流程解析
  11. 上海python数据分析_python数据分析项目——链家上海二手房数据分析(一)
  12. 知名的医药管理软件有哪些,说说看
  13. cannot safely convert passed user dtype of float32 for object dtyped data in column 0
  14. python编写poc_Poc编写
  15. 员工提出辞职后又不想走了,是否可以反悔
  16. weinre安装及使用
  17. sa8155 qnx开发笔记之一设备共享
  18. python微软雅黑_matplotlib中文显示-微软雅黑
  19. Activiti7相关问题汇总
  20. 浅析scoped属性原理及深度作用选择器

热门文章

  1. 微型计算机硬件 电子器件,微型计算机的硬件组成.docx
  2. 功能游戏-Euclidea(欧式几何)
  3. 350篇天涯论坛经典贴子合集分享(持续更新中ing)
  4. VMware12 下载安装虚拟机操作步骤详解(Linux操作系统CentOS 7)超详细版
  5. Future和Callable的使用
  6. c语言 排课系统 利用栈,如何用c语言去实现排课系统的开发,
  7. 数组,类数组相关知识点
  8. Python基于OpenCV的智能交通灯系统(南北车流量比例)[源码&部署教程]
  9. 记一次java应用内存不断增长问题解决过程
  10. java中所有类的父类Object类介绍