Python Beautiful Soup 4
Beautiful Soup 是一个灵活方便的网页解析库,利用它不用编写正则表达式即可方便地提取的网页信息
官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/
解析库
Beautiful Soup 支持 Python 标准库中的 HTML 解析器,还支持一些第三方的解析器
主要有几种:
from bs4 import BeautifulSoup
BeautifulSoup(markup, "html.parser") # Python 标准库
BeautifulSoup(markup, "lxml") # lxml HTML 解析器
BeautifulSoup(markup, "xml") # lxml XML 解析器 = BeautifulSoup(markup, ["lxml", "xml"])
BeautifulSoup(markup, "html5lib") # html5lib
官方推荐使用 lxml
基本使用
from bs4 import BeautifulSoup
soup = BeautifulSoup(markup, "lxml")
print(soup.prettify())
对象
Beautiful Soup 将复杂 HTML 文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种: Tag, NavigableString, BeautifulSoup, Comment
Tag 对象
属性
标签名
通过 Tag.name 获取 Tag 对象的标签名
Tag.name 可以被修改,会在当前 BeautifulSoup 对象修改
属性
标签的属性存储在字典中
通过 Tag.attr 可以获取属性字典,也可以直接用 key 查找 Tag[key]
如果一个属性对应多个值,则会返回一个列表
属性可以增加、删除、修改
from bs4 import BeautifulSoup
soup = BeautifulSoup(markup, "lxml")
tag = soup.div
tag['id'] = 'i1'
tag['class'] = ['c1', 'c2']
del tag['class']
print(tag.get('id'))
NavigableString 对象
字符串常被包含在tag内,并用 NavigableString 类包装
通过 tag.string 获取
BeautifulSoup 对象
BeautifulSoup 对象表示的是一个文档的全部内容,大部分时候,可以把它当作 Tag 对象
选择器
标签选择器
通过标签名可以找到第一个匹配的标签,包括它的子标签
还可以多次调用查找它的子标签
标签选择器返回的是 Tag 对象
from bs4 import BeautifulSoup
soup = BeautifulSoup(markup, "lxml")
print(soup.tag_name)
print(soup.parent_tag.child_tag)
子孙节点
contents
tag的 .contents 属性可以将 tag 的子节点以列表的方式输出
children
通过tag的 .children 生成器,可以对 tag 的子节点进行循环
list(tag.children) == tag.contents
descendants
返回一个包含所有 tag 子孙节点的生成器对象
from bs4 import BeautifulSoup
soup = BeautifulSoup(markup, "lxml")
for i, child in enumerate(soup.children):
print(i, child)
祖先节点
parent
通过 .parent 属性来获取某个元素的父节点
文档顶层节点的父节点是 BeautifulSoup 对象, BeautifulSoup 对象没有父节点(None)
parents
返回一个包含所有 tag 祖先节点的生成器对象
兄弟节点
next_sibling & previous_sibling
通过 .next_sibling & .previous_sibling 属性来获取某个元素的后一个 (前一个) 兄弟节点
如果没有返回 None
next_siblings & previous_siblings
通过 .next_siblings & .previous_siblings 属性可以对当前节点的兄弟节点迭代输出
标准选择器
find_all
find_all() 方法搜索当前 tag 的所有 tag 子节点,并判断是否符合过滤器的条件
用法:
find_all(name, attrs, recursive, text, **kwargs)
通过 name:
find_all('div')
通过 attr:
find_all(id='i1')
find_all(class_='c1')
find_all(id=True)
find_all(href=re.compile('cnblogs.com/'))
find_all(attr={'attr1': '1', 'attr2': '2'})
其他
find(name, attrs, recursive, text, **kwargs) # 返回找到的第一个
find_parents(name, attrs, recursive, text, **kwargs) # 对当前tag的祖先节点进行迭代, 返回所有符合条件的节点
find_parent(name, attrs, recursive, text, **kwargs) # 对当前tag的祖先节点进行迭代, 返回第一个符合条件的节点
find_next_siblings(name, attrs, recursive, text, **kwargs) # 对当前tag的之后的兄弟节点进行迭代, 返回所有符合条件的节点
find_next_sibling(name, attrs, recursive, text, **kwargs) # 对当前tag的之后的兄弟节点进行迭代, 返回第一个符合条件的节点
find_previous_siblings(name, attrs, recursive, text, **kwargs) # 对当前tag的之前的兄弟节点进行迭代, 返回所有符合条件的节点
find_previous_sibling(name, attrs, recursive, text, **kwargs) # 对当前tag的之前的兄弟节点进行迭代, 返回第一个符合条件的节点
find_all_next(name, attrs, recursive, text, **kwargs) # 对当前tag的之后的 tag 和字符串进行迭代, 返回所有符合条件的节点
find_next(name, attrs, recursive, text, **kwargs) # 对当前tag的之后的 tag 和字符串进行迭代, 返回第一个符合条件的节点
find_all_previous(name, attrs, recursive, text, **kwargs) # 对当前tag的之前的 tag 和字符串进行迭代, 返回所有符合条件的节点
find_previous(name, attrs, recursive, text, **kwargs) # 对当前tag的之前的 tag 和字符串进行迭代, 返回第一个符合条件的节点
CSS 选择器
Beautiful Soup支持大部分的CSS选择器, 在 Tag 或 BeautifulSoup 对象的 .select() 方法中传入字符串参数, 即可使用CSS选择器的语法找到tag
soup.select('#i1') # id 选择,选择 id = 'i1' 的标签
soup.select('.c1') # class 选择,选择 class = 'c1' 的标签
soup.select('body') # 标签选择,选择所有 body 标签
soup.select('body a') # 层级选择,选择 body 标签下的所有 a 标签
soup.select('body > a') # 层级选择,选择 body 标签下一层的所有 a 标签
soup.select('[attr1= "attr1"]') # 属性选择,选择所有 attr1 属性为 attr1 的标签
输出
格式化输出
prettify() 方法将 Beautiful Soup 的文档树格式化后以 Unicode 编码输出,每个 XML/HTML 标签都独占一行
通过 Beautiful Soup 4 预防 XSS 攻击 <--点击查看
Python Beautiful Soup 4的更多相关文章
- 推荐一些python Beautiful Soup学习网址
前言:这几天忙着写分析报告,实在没精力去研究django,虽然抽时间去看了几遍中文文档,还是等实际实践后写几篇操作文章吧! 正文:以下是本人前段时间学习bs4库找的一些网址,在学习的可以参考下,有点多 ...
- Python Beautiful Soup学习之HTML标签补全功能
Beautiful Soup是一个非常流行的Python模块.该模块可以解析网页,并提供定位内容的便捷接口. 使用下面两个命令安装: pip install beautifulsoup4 或者 sud ...
- python beautiful soup库的超详细用法
原文地址https://blog.csdn.net/love666666shen/article/details/77512353 参考文章https://cuiqingcai.com/1319.ht ...
- Python Beautiful Soup 解析库的使用
Beautiful Soup 借助网页的结构和属性等特性来解析网页,这样就可以省去复杂的正则表达式的编写. Beautiful Soup是Python的一个HTML或XML的解析库. 1.解析器 解析 ...
- python Beautiful Soup的使用
上一节我们介绍了正则表达式,它的内容其实还是蛮多的,如果一个正则匹配稍有差池,那可能程序就处在永久的循环之中,而且有的小伙伴们也对写正则表 达式的写法用得不熟练,没关系,我们还有一个更强大的工具,叫B ...
- (17)python Beautiful Soup 4.6
一.安装 1.登陆官网:https://www.crummy.com/software/BeautifulSoup/ 2.下载 3.解压 4.安装 cmd找到文件路径,运行 setup.py buil ...
- python beautiful soup
官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/ 使用前需要先安装模块,并安装解析器 pip install beautif ...
- python Beautiful Soup 采集it books pdf,免费下载
http://www.allitebooks.org/ 是我见过最良心的网站,所有书籍免费下载 周末无聊,尝试采集此站所有Pdf书籍. 采用技术 python3.5 Beautiful soup 分享 ...
- Python Beautiful Soup库
Beautiful Soup库 Beautiful Soup库:https://www.crummy.com/software/BeautifulSoup/ 安装Beautiful Soup: 使用B ...
随机推荐
- 【攻防世界】高手进阶 pwn200 WP
题目链接 PWN200 题目和JarvisOJ level4很像 检查保护 利用checksec --file pwn200可以看到开启了NX防护 静态反编译结构 Main函数反编译结果如下 int ...
- python中可变与不可变类型的全局变量
python中的不可变类型的全局变量如int a=1,str b='hello', 若需要修改必须加global申明, 而全局变量是可变类型的,如list, dict ,则直接修改list.app ...
- 【2019.10.7 CCF-CSP-2019模拟赛 T1】树上查询(tree)(思维)
思维 这道题应该算是一道思维题吧. 首先你要想到,既然这是一棵无根树,就要明智地选择根--以第一个黑点为根(不要像我一样习惯性以\(1\)号点为根,结果直到心态爆炸都没做出来). 想到这一点,这题就很 ...
- ReactNative: 使用View组件创建九宫格
一.简言 初学RN,一切皆新.View组件跟我们iOS中UIView类似,作为一个容器视图使用,它主要负责承载其他的子组件.View组件采用的是FlexBox伸缩盒子布局,通过对它的布局可以影响子组件 ...
- python做中学(四)main函数的用法
什么场景下会有main函数? 当该python脚本被作为模块(module)引入(import)时,其中的main()函数将不会被执行. main函数的作用? __name__ == '__main_ ...
- 【OCR系列之一】字符识别技术总览
最近入坑研究OCR,看了比较多关于OCR的资料,对OCR的前世今生也有了一个比较清晰的了解.所以想写一篇关于OCR技术的综述,对OCR相关的知识点都好好总结一遍,以加深个人理解. 什么是OCR? OC ...
- Java中Array与ArrayList的10个区别
Array和ArrayList都是Java中两个重要的数据结构,在Java程序中经常使用.并且ArrayList在内部由Array支持,了解Java中的Array和ArrayList之间的差异对于成为 ...
- IT兄弟连 Java语法教程 关系运算符
关系运算符用来判定一个操作数与另外一个操作数之间的关系.特别是,它们可以判定相等和排序关系.表7中列出了关系运算符. 表7 关系运算符 关系运算符的结果为布尔值.关系运算符最常用与if语句和各种循环 ...
- Unity TextMeshPro替代Text组件创建简体中文字体纹理集
Unity原生的Text组件有一个毛病,只要文本放大字体放大就会有毛边或锯齿,一个更好的解决方案是用TextMeshPro替代ugui中的Text组件. TMPro采用SDF文字渲染技术,可以使文字放 ...
- linq根据两个时间求出天数
对于在Linq To Entity里使用日期函数需要DbFunctions里的扩展方法,而不能使用.net里的日期函数,因为linq的代码会被翻译成SQL发到数据库端,如你的.net方法对于数据库是不 ...