【BOOK】解析库--Beautiful Soup
1、安装bs4库
2、解析器

3、节点选择器
from bs4 import BeautifulSoup
html = '''
<html>
<head><title>这是标题</title></head>
<body>
<p class="title" name="dromouse"><b>这是标题</b></p>
<p class="story" >从前有座山
<a href="http://www.baidu.com/1" class="sister" id="link1">链接1</a>
<a href="http://www.baidu.com/2" class="sister" id="link2">链接2</a>
<a href="http://www.baidu.com/3" class="sister" id="link3">链接3</a>
完了</p>
</body></html>
'''
soup = BeautifulSoup(html, 'lxml') ## prettify()把要解析的字符串以标准的缩进格式输出
print(soup.prettify()) ## 获取head节点
print(soup.head) # <head><title>这是标题</title></head> ## 获取p节点,返回第一个p节点
print(soup.p) ## 获取节点名称--name
print(soup.title.name) # title ## 获取节点属性--attrs
print(soup.p.attrs) # {'class': ['title'], 'name': 'dromouse'}
print(soup.p.attrs['class']) # ['title']
## 简写
print(soup.p['class']) # ['title'],返回列表,因为class属性可以有多个值
print(soup.p['name']) #dromouse,返回字符串,因为name属性只能有一个值 ## 获取节点的文本
print(soup.p.string) # 这是标题 ## 嵌套选择
print(soup.head.title) # <title>这是标题</title>
from bs4 import BeautifulSoup
html = '''
<html>
<head><title>这是标题</title></head>
<body> <p class="story" >从前有座山
<a href="http://www.baidu.com/1" class="sister" id="link1">链接1</a>
<a href="http://www.baidu.com/2" class="sister" id="link2"><span>链接2</span></a>
<a href="http://www.baidu.com/3" class="sister" id="link3">链接3</a>
完了</p>
</body></html>
'''
soup = BeautifulSoup(html, 'lxml') ## 关联选择
## 子节点 & 子孙节点 ## contents属性,返回列表,包含p节点的每一个子节点
print(soup.p.contents) ## children属性,返回所有子节点,生成器类型,用for循环输出
print(soup.p.children) ## <list_iterator object at 0x0353BF10>
for child in enumerate(soup.p.children):
print(child) ## 7个元素,包括 \n ## descendants属性,返回所有子孙节点,生成器类型,用for循环输出
print(soup.p.descendants) ## <generator object Tag.descendants at 0x03915330>
for child in enumerate(soup.p.descendants):
print(child) # 父节点 & 祖先节点
# parent属性,返回a节点的直接父节点 p
print(soup.a.parent) ## parents属性,返回所有祖先节点,生成器类型
print(list(enumerate(soup.a.parents))) ## 兄弟节点
print('下一个兄弟', soup.a.next_sibling)
print('上一个兄弟', soup.a.previous_sibling)
print('所有前面的兄弟', list(enumerate(soup.a.next_siblings)))
print('所有后面的兄弟', list(enumerate(soup.a.previous_siblings)))
4、方法选择器
(1)find_all(name, attrs, recursive, text, **kwgrgs)
返回所有匹配结果,列表类型
html = '''
<div class="panel">
<div class="panel-heading">
<h4>Hello</h4>
</div>
<div class="panel-body">
<ul class="list" id="list-1">
<li class="element">BBB</li>
<li class="element">BBB CCC</li>
<li class="element">GGG</li>
</ul>
<ul class="list list-small" id="list-2">
<li class="element">HHH</li>
<li class="element">YYY</li>
<li class="element">VVV</li>
</ul>
</div>
</div>
''' from bs4 import BeautifulSoup
import re soup = BeautifulSoup(html,'lxml') # name—根据节点名查询,返回列表,每个元素类型为Tag类型
print(soup.find_all(name='ul')) for ul in soup.find_all(name='ul'):
for li in ul.find_all(name='li'):
print(li.string) # attrs--属性查询,参数类型是字典类型,返回列表类型
print(soup.find_all(attrs={'class':'element'}))
## id,class属性为常用属性,可以不用字典形式
print(soup.find_all(class_='element'))
print(soup.find_all(id='list-1')) # text--匹配节点的文本,传入参数可以是字符串或者正则表达式
print(soup.find_all(text='BBB'))
print(soup.find_all(text=re.compile('BBB'))) # ['BBB', 'BBB CCC']
(2) find() 返回第一个匹配结果,Tag类型
(3) find_parents() 返回所有祖先节点
find_parent() 返回父亲节点
(4) find_next_siblings() 返回所有后面的兄弟节点
find_next_sibling() 返回第一个后面的兄弟节点
(5) find_previous_siblings() 返回所有前面的兄弟节点
find_ previous _sibling() 返回第一个前面的兄弟节点
(6) find_all_next () 返回所有后面的节点
find_next () 返回第一个后面的节点
(7) find_all_previous () 返回所有前面的节点
find_ previous () 返回第一个前面的节点
5、CSS选择器
select()
html = '''
<div class="panel">
<div class="panel-heading">
<h4>Hello</h4>
</div>
<div class="panel-body">
<ul class="list" id="list-1">
<li class="element">BBB</li>
<li class="element">BBB CCC</li>
<li class="element">GGG</li>
</ul>
<ul class="list list-small" id="list-2">
<li class="element">HHH</li>
<li class="element">YYY</li>
<li class="element">VVV</li>
</ul>
</div>
</div>
''' from bs4 import BeautifulSoup
import re soup = BeautifulSoup(html,'lxml')
print(soup.select('.panel-heading')) ## class属性值为 panel-heading
print(soup.select('li')) ## 返回列表类型,列表元素为Tag类型
print(soup.select('#list-2 .element')) ## 嵌套选择
for ul in soup.select('ul'):
print(ul.select('li')) ## 获取属性
for ul in soup.select('ul'):
print(ul['id'])
## 或者
print(ul.attrs['id']) ## 获取文本 get_text()
for li in soup.select('li'):
print('获得文本:', li.get_text())
print('或者:', li.string)
【BOOK】解析库--Beautiful Soup的更多相关文章
- 小白学 Python 爬虫(21):解析库 Beautiful Soup(上)
小白学 Python 爬虫(21):解析库 Beautiful Soup(上) 人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前 ...
- 小白学 Python 爬虫(22):解析库 Beautiful Soup(下)
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- python爬虫之解析库Beautiful Soup
为何要用Beautiful Soup Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式, 是一个 ...
- Python3编写网络爬虫06-基本解析库Beautiful Soup的使用
二.Beautiful Soup 简介 就是python的一个HTML或XML的解析库 可以用它来很方便的从网页中提取数据 0.1 提供一些简单的 python式的函数来处理导航,搜索,修改分析树等功 ...
- Python的html和xml解析库Beautiful Soup
网站:http://www.crummy.com/software/BeautifulSoup/ 版权声明:本文博主原创文章,博客,未经同意不得转载.
- python标准库Beautiful Soup与MongoDb爬喜马拉雅电台的总结
Beautiful Soup标准库是一个可以从HTML/XML文件中提取数据的Python库,它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式,Beautiful Soup将会节省数小 ...
- Python爬虫库-Beautiful Soup的使用
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库,简单来说,它能将HTML的标签文件解析成树形结构,然后方便地获取到指定标签的对应属性. 如在上一篇文章通过爬虫 ...
- 爬虫用到的库Beautiful Soup
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时 ...
- 爬虫(五)—— 解析库(二)beautiful soup解析库
目录 解析库--beautiful soup 一.BeautifulSoup简介 二.安装模块 三.Beautiful Soup的基本使用 四.Beautiful Soup查找元素 1.查找文本.属性 ...
- 使用Beautiful Soup
Beautiful Soup初了解 # 解析工具Beautiful Soup,借助网页的结构和属性等特性来解析网页(简单的说就是python的一个HTML或XML的解析库)# Beautiful So ...
随机推荐
- C# 前台线程 后台线程区别
前台线程 会随进程一起结束 不管是否完成,后台线程需要执行完毕,进程才能结束 例子: class Program { static void Main(string[] args) { Thread ...
- Java程序(数组扩容的尝试)
import java.util.Scanner; public class ArrayAdd { public static void main(String[] args) { int arr[] ...
- GitHub创建仓库导入项目
1.进入主页,点击+号 2.填写仓库名称 3.记住网址! 4.项目所在文件夹路径 5.打开Git Bash 6.输入命令 $ cd C: $ cd AndroidTasks $ cd MusicPla ...
- 问题记录_IDEA启动报错:Failed to create JVM. JVM Path
问题记录_IDEA启动报错:Failed to create JVM. JVM Path 起因 下午写代码的时候感觉IDEA有点卡,不应该啊,我16G咋回卡呢,分配的内存也不小,于是又去加大内存分配, ...
- Install Argo Workflows
Install Argo Workflows Release v3.4.3 · argoproj/argo-workflows (github.com) CLI # Download the bina ...
- 对 Flutter 的一些看法
Flutter 发布的时候可谓很轰动,相对于 RN 或 PhoneGap 们,它给出了另外一种跨平台方案,更像是 APP 版的 Unity,而且使用现代的声明式 UI,据说能媲美原生性能.很吸引人,所 ...
- VC如何创建C编译器能使用的动态库
方法 使用extern "C"修饰 设置统一的调用约定 举例 例1--使用__cdecl,一般C编译器使用此约定,如LabWidnows/CVI. cpp代码 extern &qu ...
- 【记录】 iSCSI服务器的搭建与使用[Debian]
序言 更换系统后需要一个网络文件存储用于备份文件,本想用NFS多方便,但是timeshift不支持网络存储,备份路径必须是一个块存储设备, 但是你还必须分好文件系统,这不是多此一举???反正我只用rs ...
- DevExpress.XtraEditors.ComboBoxEdit 只能选择不能在里面 输入数据
DevExpress.XtraEditors.ComboBoxEdit 只能选择不能在里面 输入数据 combboxEdit.propoties.textEditStyle=DisableTextEd ...
- 3DMAX安装失败怎么办?安装3DMAX失败提示错误怎么解决?
3DMAX安装失败怎么办?安装3DMAX失败提示错误怎么解决?有很多同学想把3DMAX卸载后重新安装,但是发现3DMAX安装到一半就失败了或者显示3DMAX已安装或者安装未完成,大多数情况下其实是3D ...