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. CSS中层叠和继承的概念。

    继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代.比如下面代码: 1 2 3 4 5 6 7 8 9 <ht ...

  2. Java入门程序HelloWorld

    程序开发步骤说明 开发环境已经搭建完毕,可以开发我们第一个Java程序了.Java程序开发三步骤:编写.编译.运行.如下图所示 详解: 编写源程序:通俗来说就是我们通过Java的语法自己写的代码 编译 ...

  3. angular路由事件

    Angular 4检测路由变化,可以使用router.events来监听: 支持的事件类型: NavigationStart:导航开始 NavigationEnd:导航结束 NavigationCan ...

  4. HDU2899Strange fuction(二分/三分)

    传送门 题目大意:求 F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100):的最小值 题解:求个导,二分导函数零点,就是原函数最小值所在的 ...

  5. 第04组 Alpha冲刺(2/4)

    队名:斗地组 组长博客:地址 作业博客:Alpha冲刺(2/4) 各组员情况 林涛(组长) 过去两天完成了哪些任务: 1.收集各个组员的进度 2.写博客 展示GitHub当日代码/文档签入记录: 接下 ...

  6. golang之引用自己定义的包

    初始目录如下: 其中main.go只有一个主函数main(),用于运行程序,array文件夹是自己定义的包,里面spArr.go位于package array. spArr中的函数名或变量首字母得大写 ...

  7. 【TCP/IP网络编程】:02套接字类型与协议设置

    本篇文章主要介绍创建套接字函数相关的3个输入参数的含义,它们最终确定了套接字通信所采用的协议.同时,也简单对比了TCP和UDP传输方式的区别. 什么是协议?协议是对话中使用的通信规则,而在计算机领域则 ...

  8. Find 查找命令时过滤掉某些文件或目录 以及 -maxdepth、-mindepth的用法

    1)find过滤目录使用find命令在linux系统中查找文件时,有时需要忽略某些目录,可以使用"-path 过滤的目录路径 -prune -o"参数来进行过滤.不过必须注意:要忽 ...

  9. Java泛型类型擦除与运行时类型获取

    Java的泛型大家都知道是类型擦除的方式实现的,“编译器会进行泛型擦除”是一个常识了(实际擦除的是参数和自变量的类型).“类型擦除” 并非像许多开发者认为的那样,在 <..> 符号内的东西 ...

  10. HTTP Error 500.0 - ANCM In-Process Handler Load Failure 排错历程

    先上报错图 环境 Window Server 2008 r2 netcore 2.2 排错历程 看到这个错 我第一个想到netcore 安装问题 先检查了下环境 发现没问题 我排查了下应用池 确定是无 ...