bs4即Beautiful Soup 4是另一个用来解析HTML或XML文件的Python库,不得不说Beautiful Soup这个名字取的非常合适:“美味的汤” ---- 作为汤类菜,有时候是可有可无的,就像如果没有bs4我们使用css或者xpath选择器也能做到文档解析;但是如果桌上有汤,不管是饭后喝一碗还是用来泡饭吃,都极为增色,就像bs4,它所提供的各种方法让你在解析网页的时候无所不利,将会大大的减少你的时间。
Rule No.1
如果你是第一次使用bs4,在写体验代码的时候不要把你的测试文件命名为bs4.py,这会引起一些问题。会引起什么问题?在导入BeautifulSoup的时候,from bs4 import BeautifulSoup
Python会优先从你这个文件里导入。
我的笔记
bs4的官方中文文档是:Beautiful Soup 4.2.0 文档, 其英文文档是4.4版本的。我把4.2的中文文档看了一遍,以下是我的笔记。
解析器
HTML解析器是Python的官方解释器,同时还有一个很推荐的第三方解析器叫lxml。解析器就是用来解析HTML文档的,在你指定解析那个网页内容时,你同样需要指定一个解析器,这样网页就会被解析成某种格式供你之后进行操作。你可以使用如下代码来查看文档被解析成了什么样子:
from bs4.diagnose import diagnose
data = open("bad.html").read()
diagnose(data)
几种解析器的比较(我:需要C语言库尽然也可以是劣势):
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
Python标准库 | BeautifulSoup(markup, "html.parser") |
Python的内置标准库执行速度适中文档容错能力强 | Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差 |
lxml HTML 解析器 | BeautifulSoup(markup, "lxml") |
速度快文档容错能力强 | 需要安装C语言库 |
lxml XML 解析器 | BeautifulSoup(markup, ["lxml", "xml"])``BeautifulSoup(markup, "xml") |
速度快唯一支持XML的解析器 | 需要安装C语言库 |
html5lib | BeautifulSoup(markup, "html5lib") |
最好的容错性以浏览器的方式解析文档生成HTML5格式的文档 | 速度慢不依赖外部扩展 |
一个树形结构
这个其实就是官方文档目录的一个简化版,其实我想说的都在官方文档里写的很详细了,作为一篇介绍bs4的文档我实在不知道在写些什么了。聊以凑数吧。
- 对象
- tag (可以对文档进行修改)
- attributes
- 可以用
unicode()
转换成Python字符串,一者便于操作,二者节省内存 - 特殊字符串,如注释
- 遍历文档树
- 子节点
- tag的名字,find(), find_all()方法
- .content和.children,这两项和find系列方法有异曲同工之妙。
- .descendants
- .string, .strings和.stripped_strings
- 父节点
- .parent和.parents
- 兄弟节点
- .next_sibling 和.previous_sibling
- .next_siblings 和.previous_siblings
- 回退和前进
- .next_element和.previous_element
- .next_elements和.previous_elements
- 回退前进和兄弟节点几个方法的输出有时候是一样的
- 子节点
- 搜索文档树
- 过滤器
- 字符串过滤
- 正则表达式
- 列表
- True
- 方法
- find_all()
- find_all( name , attrs , recursive , text , **kwargs )
- name参数和keyword参数
- 按CSS搜索,使用关键词
class_
- text参数
- limit参数
- recursive参数
- find系列方法
- find_all(), find()其中后者返回前者的第一项,其余用法一样
- find_parents() 和 find_parent()
- find_next_siblings() 和find_next_sibling()
- find_previous_siblings() 和 find_previous_sibling()
- find_all_next() 和 find_next()
- find_all_previous() 和 find_previous()
- CSS选择器
soup.select("body a")
- 直接子标签
- 兄弟节点标签
- CSS类名
- 通过id查判断是否存在某个属性
- 通过属性的值
- 通过语言设置
- 修改文档树
- tag
- 修改.string
- append()
- new_string() 和 .new_tag()
- insert()
- insert_before() 和 insert_after()
- clear()
- extract()
- decompose()
- replace_with()
- wrap()
- unwrap()
- 过滤器
- 输出
- 格式化输出
- 压缩输出
- get_text()
- 解析部分文档:SoupStrainer
网友评论