强大的BeautifulSoup
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库·它能够通过你喜欢的转换器实现惯用的文档导航
安装BeautifulSoup
- 推荐使用Beautiful Soup 4,已经移植到BS4中,Beautiful Soup 3已经停止开发了,下面是安装步骤:
- 如果使用新版的Debain或Ubuntu,可以通过系统软件包管理来安装:
apt-get install Python-bs4 - Beautiful Soup 4通过Pipy发布,可以通过pip安装:
pip install beautiful - 下载源码安装:https://pypi.org/project/beautifulsoup4/,进入文件夹,运行
python setup.py install
- 如果使用新版的Debain或Ubuntu,可以通过系统软件包管理来安装:
BeautifulSoup 的使用
1 快速开始
导入bs4库:
from bs4 import BeautifulSoup的使用创建BeautifulSoup对象,创建BeautifulSoup对象有种方式,
- 通过字符串创建:
soup = BeautifulSoup(html_str,'lxml',from_encoding='utf-8')
- 通过文件来创建:
soup = BeautifulSoup(open('index.html'))
文档被转化成Unicode,并且HTML的实例都被转化成Unicode编码。打印soup对象内容,格式化输出
print soup.prettify()
Beautiful Soup 会选择合适的解析器来解析这段文档,如果手动解析就要指定解析器解析。
BeautifulSoup支持Python标准库的HTML解析器,还支持一些第三方的解析器:lxml、html5lib
- lxml(需要安装c语言库,分为lxml HTML解析器和lxml XML 解析器)解析速度要比标准库中的HTML解析速度快,安装:
pip install lxml或者apt install Python-lxml - 纯python实现的html5lib(速度慢),安装:
pip install html5lib或者apt install Python-html5lib
- lxml(需要安装c语言库,分为lxml HTML解析器和lxml XML 解析器)解析速度要比标准库中的HTML解析速度快,安装:
推荐使用lxml作为解释器
2 对象种类
BeautifulSoup将复杂HTML文档转换换成一个复杂的树形结构,每个节点都是Python对象,对象可以分为4种:
- Tag
- NavigablString
- BeautifulSoup
- Comment
Tag对象就相当于HTML原生文档中的Tag,通俗就是标记。下面就是怎么在HTML抽取Tag:
- 抽取title:print soup.title
- 抽取a:print soup.a
- 抽取p:print soup.p
soup对象本身比较特殊,他的name为[document],对于其他内部标记,输出的值变为标机本身的名称。Tag不仅可以可以获取name,还可以修改name,改变之后将影响所有通过当前BeautifulSoup对象生成HTML文档。
soup.title.name = 'mytitle'
print soup.title
print soup.mytitle
运行结果:
None
<mytitle>.......</mytitle>
3 NavigableString
- 我们已经得到标记的内容,想要获取标记文字怎么办,需要用到.string
print soup.p.string
print type(soup.p.string)
BeautifulSoup 用NavigableString类包装Tag中的字符串,一个NavigableString字符串与python中Unicode字符串相同,通过Unicode()方法可以直接将NavigableString对象转换成Unicode字符串
unicode_string = unicode(soup.p.string)
- BeautifulSoup对象表示一个文档的全部内容。大部分可以把他当做Tag对象,是一个T特殊的Tag,因为BeautifulSoup对象并不是真正的HTML或者XML的标记。所以它没有name和attribute属性:
print type(soup.name)
print soup.name
print soup.attrs
运行结果:
<type 'unicode'>
[document]
{}
- Coment一些特殊对象。比如是文档注释部分:
print soup.a.string
print type(soup.a.string)
a标记里的内容实际是注释,如果用.string输出内容的话,会发现已经把注释符号去掉了。如果我们不清楚这个标记.string的情况下,可能造成数据混乱。因此提取字符串时:
if type(soup.a.string)==bs4.element.Comment:
print soup.a.string
4 遍历文档树
BeautifulSoup会将HTML转化为文档进行搜索,树形结构,
- 子节点
- 父节点
- 兄弟节点
- 前后节点
详细:[https://wizardforcel.gitbooks.io/bs4-doc/content/6.html]https://wizardforcel.gitbooks.io/bs4-doc/content/6.html
5 搜索文档树
BeautifulSoup定义了很多搜索方法,着重介绍find_all()方法
find_all( name , attrs , recursive , string , **kwargs )
find_all() 方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件
name 参数:
- 可以查找所有名字为name的标记,字符串会自动忽略。name参数取值可以字符串、正则表达式、列表、True和方法
- 比如查找文档中文档所的标记,返回值为列表:'print soup.find_all('b')'
- 如果传入的是列表参数,那会返回列表中任一元素匹配的内容返回:'print soup.find_all('b',‘b’)'
- 传入True,True可以匹配任何值,下面代码查看到所有的tag,但是不会返回字符串节点:
for tag in soup.find_all(True):
print tag.name
kwargs 参数在python中表示为keyword参数,如果指定一个名字参数不是搜索内置的参数名,搜索时把该参数当做指定名字Tag的属性来搜索。搜索指定名字的属性可以使用的参数值包括字符串、正则表达式、列表、True。
- 比如包含id参数,要搜索每个tag的“id”属性:
print soup.fina_all(id='link2')
- 比如包含id参数,要搜索每个tag的“id”属性:
可以指定多个名字的参数也可以同时过滤tag多个属性:
print soup.find_all(href=re.compile("elsie"),id="link1")
- attrs ,如果搜索包含特殊属性的tag,用到attrs:
data_soup = BeautifulSoup('<div data-foo="value">fool</div>')
data_soup.find_all(attrs={"data-foo":"value"})
- text 参数:通过text参数搜索文档中的字符串内容,与name参数可选值一样,text参数接收字符串、正则表达式、列表、True:
print soup.find_all(text="Elsie")
print soup.find_all(text={"Tillie","Elsie","Lacie"})
print soup.find_all(text=re.compile("Dormouse"))
- limit参数
- find_all返回 全部的搜索结果,如果文档很大,搜索很慢,我们不需要那么多,就可以用他限制返回数量。当搜索结果达到limit值,就停止搜索:
print soup.find_all("a",limit=2)
- recursive参数
- 调用tag的find_all()方法时,Beautiful soup会检索当前tag所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数recursive=False
print soup.find_all("title")
print soup.find_all("title",recursive=False)
CSS选择器
web前端通过类名前加.,id名前加#,就可以定位元素的位置。同样,可以用类似的方法筛选元素,用到的方法是soup.select(),返回的类型是list
1通过标记名称可以直接查找,逐层查找,也可以找到某个标记下的直接子标记和兄弟节点标记:
#直接查找title标签
print soup.select("title")
#逐层查找title标签
print soup.select("html head title")
#查找直接子节点
#查找head下的title标签
print soup.select("head > title")
#查找p下的id="link1"的标签
print soup.select("p > #link1")
#查找兄弟节点
#查找id="link1"之后class=sisiter的所有兄弟标签
print soup.select("#link1 ~ .sister")
#查找紧跟着id="link1"之后class=sisiter的子标签
print soup.select("#link1 + .sister")
- 2 通过css的类名查找
print soup.select(".sister")
print soup.select("[class~=sister]")
- 3 通过tag的id查找
print soup.select("#link1")
print soup.select("a#link2")
- 4 通过是否存在某个属性来查找
print soup.select('a[href]')
- 5 通过属性值来查找
print soup.select('a[href="http://example.com/elsie"]')
print soup.select('a[href^="http://example.com/"]')
print soup.select('a[href$="tillie"]')
print soup.select('a[href*=".com/el"]')
强大的BeautifulSoup的更多相关文章
- Python中第三方的用于解析HTML的库:BeautifulSoup
背景 在Python去写爬虫,网页解析等过程中,比如: 如何用Python,C#等语言去实现抓取静态网页+抓取动态网页+模拟登陆网站 常常需要涉及到HTML等网页的解析. 当然,对于简单的HTML中内 ...
- 八个commit让你学会爬取京东商品信息
我发现现在不用标题党的套路还真不好吸引人,最近在做相关的事情,从而稍微总结出了一些文字.我一贯的想法吧,虽然才疏学浅,但是还是希望能帮助需要的人.博客园实在不适合这种章回体的文章.这里,我贴出正文的前 ...
- 爬虫学习笔记2requests库和beautifulsoup4库学习笔记
目录 1.requests库 1.1 安装 2.beautifulsoup4 2.1 常用方法 2.2 bs4 中四大对象种类 2.3 遍历文档树 2.4 搜索文档树 查询id=head的Tag 查询 ...
- selenium+BeautifulSoup实现强大的爬虫功能
sublime下运行 1 下载并安装必要的插件 BeautifulSoup selenium phantomjs 采用方式可以下载后安装,本文采用pip pip install BeautifulSo ...
- BeautifulSoup 的用法
转自:http://cuiqingcai.com/1319.html Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python ...
- 利用BeautifulSoup抓取新浪网页新闻的内容
第一次写的小爬虫,python确实功能很强大,二十来行的代码抓取内容并存储为一个txt文本 直接上代码 #coding = 'utf-8' import requests from bs4 impor ...
- python 之readability与BeautifulSoup
以前要采集某个网页,一般做法是写程序源代码爬出来,然后用正则去匹配出来,这种针对指定的网页去爬效果还可以,但是如果是批量的网页这种实现就会变得不现实,在这时候就有readability出手的意义了,r ...
- 【爬虫】python之BeautifulSoup用法
1.爬虫 网络爬虫是捜索引擎抓取系统的重要组成部分.爬虫的主要目的是将互联网上的网页下载到本地形成一个或联网内容的镜像备份.通过分析和过滤HTML 代码,实现对图片.文字等资源的获取. 2.pytho ...
- BeautifulSoup简述
网页解析器 从网页中提取有价值数据的工具 网页解析器种类 正则表达式 (模糊匹配) html.parser (结构化解析) BeautifulSoup第三方插件 (结构化解析,相对比较强大) lxml ...
随机推荐
- vmware虚拟机新增磁盘及挂载详细步骤
虚拟机新增磁盘及挂载步骤 1.新增磁盘 (1) 编辑虚拟机设置->添加 (2) 选择硬盘->下一步 (3) 选择SCSI格式,下一步 (4) 创建新虚拟磁盘,下一步 (5) 设置 ...
- Jmeter的安装配置
最近我在学习软件测试,然鹅学习最大的成效就是实践,这不刚看完视频之后就开始自己动手了... 首先要下载软件--JMETER: 1).在输入框中输入jmeter,然后找到Apache Jmeter 官 ...
- H5微信分享相关规范
微信分享 用户调用微信的分享功能,可以自定义分享的title和描述,以及小图标和链接.可以分享到群.好友.朋友圈.QQ.QQ空间等. 分享设计规范 分享标题:14字以内,建议使用朋友般亲切的口吻 分享 ...
- ESlint配置案例及如何配置
1.中文官网: https://eslint.cn/ 2.先看一个写好的eslint规则: 3.下面再给一个例子 module.exports = { "parser": &quo ...
- ScrollViewer控件
内容超过空间,出现滚动条. <Grid> <ScrollViewer Margin="5" VerticalScrollBarVisibility="A ...
- hdu 5761 Rower Bo 微分方程
Rower Bo Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
- 【CUDA 基础】2.4 设备信息
title: [CUDA 基础]2.4 设备信息 categories: CUDA Freshman tags: CUDA Device Information toc: true date: 201 ...
- Loooooooooooooooong time no see!
好久没来啦~去年这会一口气写了好多,是因为即将离职,在公司闲的没事,再加上也积累了一些东西想分享. 最近有个朋友给我私信求助,才又想起这里.这快一年时间,又学习了不少东西.从何写起呢,哈哈,不知道啊~ ...
- [题解] [HNOI2014] 世界树
题面 [HNOI2014]世界树 题解 从数据范围很容易看出是个虚树DP(可惜看出来了也还是不会做) 虚树大家应该都会, 不会的话自己去搜吧, 我懒得讲了, 我们在这里只需要考虑如何DP即可 首先我们 ...
- AIDL 的工作原理
当创建AIDL文件并Clean Project 代码后,会生成相应的Java文件: 先来一段伪代码:类整体结构 /* * This file is auto-generated. DO NOT MOD ...