BeautifulSoup4库

和lxml一样,Beautiful Soup也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML数据。
lxml只会局部遍历,而Beautiful Soup是基于HTMLDOM的,会载入整个文档,解析整个DOM树,因此时间和内存开销都会大很多,所以性能要低于lxml。
BeautifulSoup用未解析HTML比较简单,AP非常人性化,支持CSS选择器、Python标准库中的HTML解析器,也支持lxml的XML解析器。
Beautiful Soup3目前已经停止开发,推荐现在的项目使用Beautiful Soup 4。

解析工具

解析工具 解析速度  使用难度
BeautifulSoup 最慢 最简单
lxml 简单
re正则 最快  

简单使用:

import requests
from bs4 import BeautifulSoup
url = "https://baike.baidu.com/item/%E7%99%BE%E5%BA%A6%E7%99%BE%E7%A7%91"
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
} url1 = requests.get(url, headers=headers)
url1.encoding="urf-8" #适用于文字出现乱码
soup = BeautifulSoup(url1.text,'lxml')
'''
print(soup.title) #输出标题(标签)
print(soup.a.string) #输出a标签内的文字
print(soup.p.attrs) #输出p标签的所有属性 得到的类型是一个字典 如果想单独获得一个属性 :soup.p['class']
#遍历文档树
print(soup.head.contents) # .content 属性可以将tag的子节点以列表的方式输出
#print(soup.head.children) 通过遍历获取所有子节点
for child in soup.body.children:
print(child)
for child in soup.descendants:
print(child) for string in soup.stripped_strings:
print(repr(string)) #可以去除多余空白内容 content = soup.head.title.string
for parent in content.parents:
print(parent.name) #全部父节点
'''
for sibling in soup.a.next_siblings:
print(repr(sibling))

提取数据

from bs4 import BeautifulSoup

text = """
<table class="tablelist" cellpadding="0" cellspacing="0">
<tbody><tr class="h">
<td class="l" width="374">职位名称</td>
<td>职位类别</td>
<td>人数</td>
<td>地点</td>
<td>发布时间</td>
</tr>
<tr class="even">
<td class="l square"><a target="_blank" href="position_detail.php?id=44606&amp;keywords=技术&amp;tid=0&amp;lid=0">MIG09-QQ浏览器视频前端开发工程师</a></td>
<td>技术类</td>
<td>1</td>
<td>深圳</td>
<td>2018-10-01</td>
</tr>
<tr class="odd">
<td class="l square"><a target="_blank" href="position_detail.php?id=44599&amp;keywords=技术&amp;tid=0&amp;lid=0">17520-U3D手游客户端开发</a></td>
<td>技术类</td>
<td>2</td>
<td>深圳</td>
<td>2018-10-01</td>
</tr>
<tr class="even">
<td class="l square"><a target="_blank" href="position_detail.php?id=44602&amp;keywords=技术&amp;tid=0&amp;lid=0">22989-腾讯云高级文档开发经理(深圳)</a></td>
<td>产品/项目类</td>
<td>2</td>
<td>深圳</td>
<td>2018-10-01</td>
</tr>
<tr class="odd">
<td class="l square"><a target="_blank" href="position_detail.php?id=44604&amp;keywords=技术&amp;tid=0&amp;lid=0">18796-Android开发工程师(深圳)</a><span class="hot">&nbsp;</span></td>
<td>技术类</td>
<td>1</td>
<td>深圳</td>
<td>2018-10-01</td>
</tr>
<tr class="even">
<td class="l square"><a target="_blank" href="position_detail.php?id=44591&amp;keywords=技术&amp;tid=0&amp;lid=0">29050-数据安全经理/专家(北京)</a></td>
<td>职能类</td>
<td>2</td>
<td>北京</td>
<td>2018-10-01</td>
</tr>
<tr class="odd">
<td class="l square"><a target="_blank" href="position_detail.php?id=44587&amp;keywords=技术&amp;tid=0&amp;lid=0">29050-CII政策发展经理</a></td>
<td>职能类</td>
<td>2</td>
<td>深圳</td>
<td>2018-10-01</td>
</tr>
<tr class="even">
<td class="l square"><a target="_blank" href="position_detail.php?id=44588&amp;keywords=技术&amp;tid=0&amp;lid=0">29050-CII政策发展经理</a></td>
<td>职能类</td>
<td>2</td>
<td>北京</td>
<td>2018-10-01</td>
</tr>
<tr class="odd">
<td class="l square"><a target="_blank" href="position_detail.php?id=44590&amp;keywords=技术&amp;tid=0&amp;lid=0">29050-数据安全经理/专家(深圳)</a></td>
<td>职能类</td>
<td>2</td>
<td>深圳</td>
<td>2018-10-01</td>
</tr>
<tr class="even">
<td class="l square"><a target="_blank" href="position_detail.php?id=44581&amp;keywords=技术&amp;tid=0&amp;lid=0">28994-区块链底层开发工程师(深圳)</a></td>
<td>技术类</td>
<td>2</td>
<td>深圳</td>
<td>2018-10-01</td>
</tr>
<tr class="odd">
<td class="l square"><a target="_blank" href="position_detail.php?id=44583&amp;keywords=技术&amp;tid=0&amp;lid=0">29050-CII产品合规经理</a></td>
<td>职能类</td>
<td>2</td>
<td>深圳</td>
<td>2018-10-01</td>
</tr>
<tr class="f">
<td colspan="5">
<div class="left">共<span class="lightblue total">1184</span>个职位</div>
<div class="right"><div class="pagenav"><a href="javascript:;" class="noactive" id="prev">上一页</a><a class="active" href="javascript:;">1</a><a href="position.php?keywords=技术&amp;start=10#a">2</a><a href="position.php?keywords=技术&amp;start=20#a">3</a><a href="position.php?keywords=技术&amp;start=30#a">4</a><a href="position.php?keywords=技术&amp;start=40#a">5</a><a href="position.php?keywords=技术&amp;start=50#a">6</a><a href="position.php?keywords=技术&amp;start=60#a">7</a><a href="position.php?keywords=技术&amp;start=70#a">...</a><a href="position.php?keywords=技术&amp;start=1180#a">119</a><a href="position.php?keywords=技术&amp;start=10#a" id="next">下一页</a><div class="clr"></div></div></div>
<div class="clr"></div>
</td>
</tr>
</tbody>
</table>
"""
soup = BeautifulSoup(text,'lxml')
# 1.获得所有tr标签
# trs = soup.find_all('tr') #find_all('tr',limit=2) limit为上限值 意思是只获得2个tr标签
# for tr in trs:
# print(tr) # 2.获取第二个标签
# tr = soup.find_all('tr')[1]
# print(tr) # 3.获取所有class等于even的tr标签
# (方法1)
# trs = soup.find_all('tr',class_='even') #class后必须加_ 对python关键字进行区分
# for tr in trs:
# print(tr)
# (方法2)
# trs = soup.find_all('tr',attrs={'class':"even"}) #指定字典的显示匹配
# for tr in trs:
# print(tr) # 4.将所有id等于prev,class等于noactive的a标签提取出来
# trs = soup.find_all('a',class_='noactive',id='prev') #多个条件 或 trs = soup.find_all('a',attrs={"id":"prev","class":"noactive"})
# for tr in trs:
# print(tr) # 5.获得所有a标签的href属性
# alist = soup.find_all('a')
#
# for a in alist:
# # (1).通过下标操作的方式
# # href=a['href'] #下标方式
# # print(href)
# # (2).通过attrs属性的方式
# href= a.attrs['href']
# print(href) # 6.获取职位信息
trs = soup.find_all("tr")[1:] #第0个(地址)tr标签过滤
movies = []
for tr in trs:
movie = {}
#(方法1)
# tds = tr.find_all("td")
# print(tds[1].string)
# title = tds[0].string
# category = tds[1].string
# nums = tds[2].string
# city = tds[3].string
# pubtime = tds[4].string
# movie['title'] = title
# movie['category'] = category
# movie['nums'] = nums
# movie['city'] = city
# movie['pubtime'] = pubtime
# movies.append(movie)
#(方法2)
infos = list(tr.stripped_strings) #获取所有非空白字符(过滤空格、回车等字符)
movie['title'] = infos[0]
movie['category'] = infos[1]
movie['nums'] = infos[2]
movie['city'] = infos[3]
movie['pubtime'] = infos[4]
movies.append(movie)
print(movies)
#BeautifulSoup笔记:
##find_a11的使用:
1.在提取标签的时候,第一个参数是标签的名字。然后如果在提取标签的时候想要使用标签属性进行过滤,那么可以在这个方法中通过关键字参数的形式,将属性的名字以及对应的值传进去。或者是使用“attrs“属性,将所有的属性以及对应的值放在一个字典中传给attrs 属性。
2.有些时候,在提取标签的时候,不想提取那么多,那么可以使用‘1imit'参数。限制提取多少个。
##find与find_a11的区别:
1.find:找到第一个满足领件的标签就返回。说白了,就是只会返回一个元素。
2.find_al1:将所有满足条件的标签都返回。说白了,会返回很多标签(以列表的形式)
##使用find和find_al1的过滤条件:
1.关键字参数:将属性的名字作为关键字参数的名字,以及属性的值作为关键字参数的值进行过滤
2.attrs参数:将属性条件放到一个字典中,传给attrs参数。 ##strings和stripped_strings、string属性以及get_text方法:
1.string:获取某个标签下的非标签字符串。
2.strings:获取某个标签下的子孙非标签字符串。
2.stripped_strings:获取某个标签下的子孙非标签字符串,会去掉空白字符。
4.get_text:获取某个标签下的子孙非标签字符串。不是以列表的形式返回。
eg: tr=soup.find_all('tr')[1]
text=tr.get_text()
##常见的四种对象:
1.Tag:Beautifulsoup中所有的标签都是Tag类型,并且BeautifulSoup的对象其实本质上也是一个Tag类型。所以其实一些方法比如find、find_all并不是BeautifulSoup的,而是Tag的。
2.Navigablestring:继承自python中的str,用起来就跟使用python的str是一样的。
3.BeautifulSoup:继承自Tag。用来生成BeautifulSoup树的。对于一些查找方法,比如find、select这些,其实还是Tag的。
4.Comment:这个也没什么好说,就是继承自Navigablestring。

##contents和children:
返回某个标签下的直接子元素,其中也包括字符串。他们两的区别是:.contents返回来的是一个列表,.children返回的是一个迭代器。|

												

BeautifulSoup4库的更多相关文章

  1. Python网络爬虫——BeautifulSoup4库的使用

    使用requests库获取html页面并将其转换成字符串之后,需要进一步解析html页面格式,提取有用信息. BeautifulSoup4库,也被成为bs4库(后皆采用简写)用于解析和处理html和x ...

  2. Python:requests库、BeautifulSoup4库的基本使用(实现简单的网络爬虫)

    Python:requests库.BeautifulSoup4库的基本使用(实现简单的网络爬虫) 一.requests库的基本使用 requests是python语言编写的简单易用的HTTP库,使用起 ...

  3. Python 爬虫 BeautifulSoup4 库的使用

    BeautifulSoup4库 和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据.lxml 只会局部遍历,而Be ...

  4. 爬虫学习笔记2requests库和beautifulsoup4库学习笔记

    目录 1.requests库 1.1 安装 2.beautifulsoup4 2.1 常用方法 2.2 bs4 中四大对象种类 2.3 遍历文档树 2.4 搜索文档树 查询id=head的Tag 查询 ...

  5. 用requests库和BeautifulSoup4库爬取新闻列表

    import requests from bs4 import BeautifulSoup url='http://news.gzcc.cn/html/xiaoyuanxinwen/' res=req ...

  6. BuautifulSoup4库详解

    1.BeautifulSoup4库简介 What is beautifulsoup ? 答:一个可以用来从HTML 和 XML中提取数据的网页解析库,支持多种解析器(代替正则的复杂用法) 2.安装 p ...

  7. python BeautifulSoup库的基本使用

    Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树(parse tree). 它提供简单又常用的导航(navigating),搜索以 ...

  8. python应用之爬虫实战2 请求库与解析库

    知识内容: 1.requests库 2.selenium库 3.BeautifulSoup4库 4.re正则解析库 5.lxml库 参考: http://www.cnblogs.com/wupeiqi ...

  9. 【转载】Beautiful Soup库(bs4)入门

    转载自:Beautiful Soup库(bs4)入门 该库能够解析HTML和XML 使用Beautiful Soup库:      from bs4 import BeautifulSoup impo ...

随机推荐

  1. python实现猜字游戏

    import randomx = random.randint(0,99)while(True): num = input("please input a number\n") i ...

  2. ACM-自学之旅

    分类 知识清单 数据结构 链式前向星 树状数组 线段树 线段树的区间合并 基于ST表格的RMQ 图论 最近公共祖先 树的直径.树的重心与树的点分治 树的最小支配集,最小点覆盖与最大独立集 求无向连通图 ...

  3. Linux uniq 命令

    Linux uniq 命令  Linux 命令大全 Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用. uniq 可检查文本文件中重复出现的行列. 语法 ...

  4. mysql常用的用户授权语句

    一:授权主要的 SQL //某个数据库所有的权限 ALL 后面+ PRIVILEGES GRANT ALL PRIVILEGES ON 库名.* TO '用户'@'%' IDENTIFIED BY ' ...

  5. Python正则表达式指南(转)

    目录 Python正则表达式指南(转) 0.防走丢 1. 正则表达式基础 1.1. 简单介绍 1.2. 数量词的贪婪模式与非贪婪模式 1.3. 反斜杠的困扰 1.4. 匹配模式 2. re模块 2.1 ...

  6. Python:Mac 下 MQTT 服务器 Mosquitto 的配置

    我在Mac电脑上搭建时遇到了一些不同于网上大部分情况的问题,特此分享给可能也有遇到相同情况又找不到解决方法的人. 我的电脑系统:macOS Mojave 10.14.3. paho-mqtt 的安装 ...

  7. beego学习1

    下载 go get -u -v github.com/astaxie/beego   beego源码 go get -u -v  github.com/beego/bee   bee开发工具 bee ...

  8. ArcGis Python脚本——将细碎小面合并到相邻的面积最大的面

    参数: polygon_fc 面要素类 area_limit 给定面积值,小于它的面会被合并 给定两个参数即可,这回没有注释. #polygon_fc 面要素类 #area_limit 给定面积值,小 ...

  9. windows 7 命令修改IP地址

    netsh interface ip set address "本地连接"  static 172.17.15.97 255.255.255.0 172.17.12.1

  10. PMP知识点(四)——项目管理计划的内容

    项目管理计划([4.2制定项目管理计划]的输出) 包含三个基准和十三个子计划和一些其他内容 三个基准:成本基本.进度基准.范围基准 其中范围基准([5.4创建WBS]的输出)包含了:项目范围说明书.W ...