[爬虫] BeautifulSoup库
Beautiful Soup库基础知识
Beautiful Soup库是解析xml和html的功能库。html、xml大都是一对一对的标签构成,所以Beautiful Soup库是解析、遍历、维护“标签树”的功能库,只要提供的是标签类型Beautiful Soup库都可以进行很好的解析。
Beauti Soup库的导入
from bs4 import BeautifulSoup
import bs4
html文档 == 标签树 == BeautifulSoup类 可以认为三者是等价的
>>>from bs4 import BeautifulSoup
>>>soup = BeautifulSoup('<html>data</html>','html.parser')
>>>soup1=BeautifulSoup(open(r'D:\demo.html'),'html.parser')
简单来说一个BeautifulSoup类对应一个html文档的全部内容。如上面的soup、soup1都对应一个html文档。
Beautiful Soup类的基本元素
- Tag 标签 最基本的信息组织单元,分别用<></>开头结尾,通过soup.<标签>获得
- Name 标签名字,通过<标签>.name获取到
- Attribute 标签的属性,字典形式,通过<标签>.attrs获取
- Navigablestring 标签对之间的字符串,通过<标签>.string获取
- Comment 标签内字符串的注释部分,一种特殊的Comment类型
soup.标签名 可获得该标签信息,当存在多个一样的标签时,默认返回第一个标签的信息。
>>> soup=BeautifulSoup(demo,'html.parser')
>>> soup.title
<title>四大美女</title>
>>> soup.a
<a href="http://www.baidu.com" target="_blank"><img alt="" heigth="200" src="picture/1.png" title="貂蝉" width="150"/></a>
soup.标签.name 可获取标签的名字,以字符串形式返回
>>> soup.a.name #获取a标签的名字
'a'
>>> soup.a.parent.name #获取a标签的上级标签名字
'p'
>>> soup.a.parent.parent.name #获取a标签的上上级标签的名字
'hr'
soup.标签.attrs 可获得标签的属性,以字典形式返回
>>> soup.a.attrs #获取a标签的属性,字典返回
{'href': 'http://www.baidu.com', 'target': '_blank'}
>>> tag = soup.a.parent
>>> tag.name #获取p标签的属性,字典返回
'p'
>>> tag.attrs
{'align': 'center'}
因为返回的是字典可以采用字典的方法对其进行信息的提取。
>>> for i,j in soup.a.attrs.items(): #for循环遍历字典
print(i,j)
href http://www.baidu.com
target _blank
>>> soup.a.attrs['href'] #获取某个key的value值
'http://www.baidu.com'
>>> soup.a.attrs.keys() #获取字典所有的keys
dict_keys(['href', 'target'])
>>> soup.a.attrs.values() #获取字典所有values
dict_values(['http://www.baidu.com', '_blank'])
soup.标签.string 可以获取标签之间的文本,返回字符串
>>> soup.title.string #获取title表之间的文本
'四大美女'
>>> soup.a.string #获取a标签之间的文本,没有返回空
>>> soup.a
<a href="http://www.baidu.com" target="_blank"><img alt="" heigth="200" src="picture/1.png" title="貂蝉" width="150"/></a>
基于bs4库的HTML的遍历方法
HTML基本格式


标签树的下行遍历
属性及说明
- .contents 子节点的列表,将<tag>标签所有儿子节点存入列表
- .children 子节点的迭代类型,与.content类似,用于循环遍历儿子节点
- .descendants 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历
>>> soup.head
<head>
<meta charset="utf-8">
<title>四大美女</title>
</meta></head>
>>> soup.head.contents #获取head标签下的儿子节点
['\n', <meta charset="utf-8">
<title>四大美女</title>
</meta>]
>>> len(soup.body.contents) #通过len函数获取body标签的儿子节点个数
3
>>> for i in soup.body.children: #遍历body标签的儿子节点
print(i)
>>> for i in soup.body.descendants: #遍历body标签所有的儿子、子孙节点
print(i)
标签树的上行遍历
- .parent 当前节点的父亲标签
- .parents 节点先辈标签的迭代类型,用于循环遍历先辈节点。
标签树的平行遍历
- .next_sibling 返回按照html文本顺序的下一个平行节点标签
- .previous_sibling 返回按照html文本顺序的上一个平行节点标签
- .next_siblings 迭代类型,返回按照html文本顺序的后续所有平行节点标签
- .previous_siblings 迭代类型,返回按照html文本顺序的前续所有平行节点标签
总结如下图:

bs4库的prettify()方法--让HTML内容更加“友好”的显示

信息提取
Beautiful Soup库提供了<>.find_all()函数,返回一个列表类型,存储查找的结果。
详细介绍如下:
<>.find_all(name, attrs, recursive, string,**kwargs)
<tag>(...) == <tag>.find_all(...)
soup(...) == soup.find_all(...)
- name : 对标签名称的检索字符串
- attrs: 对标签属性值的检索字符串,可标注属性检索
- recursive : 是否对子孙全部检索,默认 True
- string : <>...</>中字符串区域的检索字符串
>>> soup.find_all('p',target='_blank') #查找p标签,而且属性值是_blank的
[]
>>> soup.find_all(id='su') #查找id属性值是su的标签
[<input class="bg s_btn" id="su" type="submit" value="百度一下"/>]
[爬虫] BeautifulSoup库的更多相关文章
- Python爬虫-- BeautifulSoup库
BeautifulSoup库 beautifulsoup就是一个非常强大的工具,爬虫利器.一个灵活又方便的网页解析库,处理高效,支持多种解析器.利用它就不用编写正则表达式也能方便的实现网页信息的抓取 ...
- 网络爬虫BeautifulSoup库的使用
使用BeautifulSoup库提取HTML页面信息 #!/usr/bin/python3 import requests from bs4 import BeautifulSoup url='htt ...
- python爬虫BeautifulSoup库class_
因为class是python的关键字,所以在写过滤的时候,应该是这样写: r = requests.get(web_url, headers=headers) # 向目标url地址发送get请求,返回 ...
- Python爬虫小白入门(三)BeautifulSoup库
# 一.前言 *** 上一篇演示了如何使用requests模块向网站发送http请求,获取到网页的HTML数据.这篇来演示如何使用BeautifulSoup模块来从HTML文本中提取我们想要的数据. ...
- python爬虫学习之使用BeautifulSoup库爬取开奖网站信息-模块化
实例需求:运用python语言爬取http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html这个开奖网站所有的信息,并且保存为txt文件和excel文件. 实 ...
- python爬虫学习(一):BeautifulSoup库基础及一般元素提取方法
最近在看爬虫相关的东西,一方面是兴趣,另一方面也是借学习爬虫练习python的使用,推荐一个很好的入门教程:中国大学MOOC的<python网络爬虫与信息提取>,是由北京理工的副教授嵩天老 ...
- Python爬虫利器:BeautifulSoup库
Beautiful Soup parses anything you give it, and does the tree traversal stuff for you. BeautifulSoup ...
- $python爬虫系列(2)—— requests和BeautifulSoup库的基本用法
本文主要介绍python爬虫的两大利器:requests和BeautifulSoup库的基本用法. 1. 安装requests和BeautifulSoup库 可以通过3种方式安装: easy_inst ...
- python爬虫入门四:BeautifulSoup库(转)
正则表达式可以从html代码中提取我们想要的数据信息,它比较繁琐复杂,编写的时候效率不高,但我们又最好是能够学会使用正则表达式. 我在网络上发现了一篇关于写得很好的教程,如果需要使用正则表达式的话,参 ...
随机推荐
- TensorFlow使用记录 (六): 优化器
0. tf.train.Optimizer tensorflow 里提供了丰富的优化器,这些优化器都继承与 Optimizer 这个类.class Optimizer 有一些方法,这里简单介绍下: 0 ...
- 推荐系统系列(六):Wide&Deep理论与实践
背景 在CTR预估任务中,线性模型仍占有半壁江山.利用手工构造的交叉组合特征来使线性模型具有"记忆性",使模型记住共现频率较高的特征组合,往往也能达到一个不错的baseline,且 ...
- Partial Dependence Plot
Partial Dependence就是用来解释某个特征和目标值y的关系的,一般是通过画出Partial Dependence Plot(PDP)来体现. PDP是依赖于模型本身的,所以我们需要先训练 ...
- mysql5.7以上基本配置
MySQL表名区分大小写设置 关闭MySQL服务 在服务运行目录找到my.ini或者my.cnf文件 find / -name my.cnf 打开文件,找到[mysqld]在下面增加一行 lower_ ...
- Redis内存满了的几种解决方法(内存淘汰策略与Redis集群)
1,增加内存: 2,使用内存淘汰策略. 3,Redis集群. 重点介绍下23: 第2点: 我们知道,redis设置配置文件的maxmemory参数,可以控制其最大可用内存大小(字节). 那么当所需内存 ...
- redis的incr和incrby命令
Redis Incr 命令将 key 中储存的数字值增一,如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作. Redis Incrby 命令将 key 中储存的 ...
- airflow当触发具有多层subDAG的任务的时候,出现[Duplicate entry ‘xxxx’ for key dag_id]的错误的问题处理
当触发一个具有多层subDAG的任务时,会发现执行触发的task任务运行失败,但是需要触发的目标DAG已经在运行了,dag log 错误内容: [2019-11-21 17:47:56,825] {b ...
- When 表达式 kotlin(9)
When 表达式 when 取代了类 C 语言的 switch 操作符.其最简单的形式如下:控制流when (x) { 1 -> print("x == 1") 2 -> ...
- ASimpleCache源码分析
ASimpleCache里只有一个JAVA文件——ACache.java,首先我用思维导图制作了ACache类的详细结构图: 通过分析官方给的demo来驱动源码分析吧 以字符串存储为例(官方给的dem ...
- 2019.12.04 ADT on eclipse 配置篇
今天看JerryWang的简书博客https://www.jianshu.com/p/74ad8e4bbc49 ,SAP GUI 和ADT是互为补充的关系,有很多SAP新出的技术都没有办法在GUI上开 ...