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的更多相关文章

  1. 推荐一些python Beautiful Soup学习网址

    前言:这几天忙着写分析报告,实在没精力去研究django,虽然抽时间去看了几遍中文文档,还是等实际实践后写几篇操作文章吧! 正文:以下是本人前段时间学习bs4库找的一些网址,在学习的可以参考下,有点多 ...

  2. Python Beautiful Soup学习之HTML标签补全功能

    Beautiful Soup是一个非常流行的Python模块.该模块可以解析网页,并提供定位内容的便捷接口. 使用下面两个命令安装: pip install beautifulsoup4 或者 sud ...

  3. python beautiful soup库的超详细用法

    原文地址https://blog.csdn.net/love666666shen/article/details/77512353 参考文章https://cuiqingcai.com/1319.ht ...

  4. Python Beautiful Soup 解析库的使用

    Beautiful Soup 借助网页的结构和属性等特性来解析网页,这样就可以省去复杂的正则表达式的编写. Beautiful Soup是Python的一个HTML或XML的解析库. 1.解析器 解析 ...

  5. python Beautiful Soup的使用

    上一节我们介绍了正则表达式,它的内容其实还是蛮多的,如果一个正则匹配稍有差池,那可能程序就处在永久的循环之中,而且有的小伙伴们也对写正则表 达式的写法用得不熟练,没关系,我们还有一个更强大的工具,叫B ...

  6. (17)python Beautiful Soup 4.6

    一.安装 1.登陆官网:https://www.crummy.com/software/BeautifulSoup/ 2.下载 3.解压 4.安装 cmd找到文件路径,运行 setup.py buil ...

  7. python beautiful soup

    官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/ 使用前需要先安装模块,并安装解析器 pip install beautif ...

  8. python Beautiful Soup 采集it books pdf,免费下载

    http://www.allitebooks.org/ 是我见过最良心的网站,所有书籍免费下载 周末无聊,尝试采集此站所有Pdf书籍. 采用技术 python3.5 Beautiful soup 分享 ...

  9. Python Beautiful Soup库

    Beautiful Soup库 Beautiful Soup库:https://www.crummy.com/software/BeautifulSoup/ 安装Beautiful Soup: 使用B ...

随机推荐

  1. Codeforces Round #594 (Div. 2) A. Integer Points 水题

    A. Integer Points DLS and JLS are bored with a Math lesson. In order to entertain themselves, DLS to ...

  2. javascript中优雅的处理async和await异常

    let handler = async function(needErr) { return new Promise((resolve, reject) => { if (needErr) { ...

  3. python--8大排序(原理+代码)

    常用的排序方法:冒泡排序.选择排序.插入排序.快速排序.堆排序.归并排序 冒泡排序(Bubble Sort): 比较相邻的元素.如果第一个比第二个大(升序),就交换他们两个. 对每一对相邻元素作同样的 ...

  4. 大话设计模式Python实现-单例模式

    单例模式(Singleton Pattern):保证类仅有一个实例,并提供一个访问它的全局访问点. 下面是单例模式的demo: #!/usr/bin/env python # -*- coding:u ...

  5. 利用OD破解一个简单的C语言程序

    最近在学习汇编(看的是王爽老师的<汇编语言(第三版)>),然后想尝试使用OD(Ollydbg)软件破解一个简单的C语言程序练练手. 环境: C语言编译环境:VC++6.0 系统:在Wind ...

  6. shell 命令 tar -zxvf 解压 tar -zcvf 压缩

    tar -zxvf 解压 tar -zcvf 压缩

  7. java.lang.ClassNotFoundException: XXX (no security manager: RMI class loader disabled)

    在搞RMI远程发布,consumer去获取rmi远程服务的代理对象的时候出现了如下的错误 问题发现: 由于我发布的对象的包路径和获取的对象的包路径不一致,导致了这样的问题 解决方案: 包路径改为一致就 ...

  8. Web前端——Html常用标签及属性

    html 常用的标题等标签就不记录了,只记录一下比较少见的标签以及属性 表格 table td 单元格 tr 表的行 th 表头 td或th可以下面的两个属性达到跨行或跨列 表格跨行 rowspan ...

  9. 死磕 java同步系列之AQS终篇(面试)

    问题 (1)AQS的定位? (2)AQS的重要组成部分? (3)AQS运用的设计模式? (4)AQS的总体流程? 简介 AQS的全称是AbstractQueuedSynchronizer,它的定位是为 ...

  10. ASP.NET MVC IOC 之 Autofac(一)

    新建一个MVC项目,如 AutoFacTest,引用autofac,如下图: 接下来就是开始进行编程了 首先,新建一个类库,名为 AutoFacTest.Service,该类库编写服务层代码,我们的接 ...