bs4 解析网页
安装
pip install beautifulsoup4
第一步:创建soup对象
BeautifulSoup() 类
- 第一个参数是html格式的文本,常传入
res.text - 第二个位置参数是解析器,常使用
"lxml" - 关键字参数
multi_valued_attributes(默认按照html语法规范解析,不推荐使用此参数修改配置)multi_valued_attributes=None,将所有html标签的属性当做是单值属性解析multi_valued_attributes=class_is_multi,将所有属性当做多值属性解析
常用的解析器:
- html.parser解析器(属于python标准库)
BeautifulSoup(res.text, "html.parser")- Python的内置标准库
- 执行速度较快
- 容错能力强
- 速度没有 lxml 快,容错没有 html5lib强
- lxml HTML解析器(第三方库,推荐使用)
BeautifulSoup(res.text, "lxml")- 速度快
- 容错能力强
- 额外的 C 依赖
- lxml XML解析器(第三方库)
BeautifulSoup(markup, ["lxml-xml"])或BeautifulSoup(markup, "xml")- 速度快
- 唯一支持 XML 的解析器
- 额外的 C 依赖
- 使用此解析器,所有属性当做是单值属性解析
- html5lib解析器(第三方库)
BeautifulSoup(markup, "html5lib")- 最好的容错性
- 以浏览器的方式解析文档
- 生成 HTML5 格式的文档
- 速度慢
- 额外的 Python 依赖
第二步:对soup对象进行操作
soup对象的属性和方法:
-
所有html标签都可以看做是soup对象的属性,
soup.标签相当于对soup对象使用了元素选择器,且只选中 {==第一个==} 匹配到的对象,返回tag对象,以下是tag对象的属性和方法(soup对象支持大多数tag对象的属性和方法)???+ note "子节点"
tag 可能包含多个字符串或其它的 tag,这些都是这个 Tag 的子节点。name属性,用于获取标签名(有些鸡肋),可以对其重新赋值,并会对tag对象产生影响(改变html元素的标签),对子节点使用时,如果子节点是字符串,则返回Nonestring属性,用于获取标签包裹的文字,返回NavigableString 对象,使用str()函数可以将NavigableString 对象转换成python字符串,如果tag对象中还嵌套了其他html标签(子节点),返回None。NavigableString 对象的属性和方法如下:replace_with()方法 将NavigableString 对象中的字符串替换为传入的字符串
attrs属性,返回所有属性的字典,属性名作为键,属性值作为值,多值属性(如class)的值用字典表示contents属性,返回tag对象所有节点的列表tag['key']字典操作,可以把tag对象的名称当做是字典的变量名,这个字典实际上就是tag.attrs,tag对象 的属性可以被添加、删除或修改。tag的属性操作方法与字典一样get_attribute_list()方法 传入属性名,返回属性值列表,单值属性(id等单值属性,即使因为书写不规范导致属性值之间有空格,仍然返回单元素列表)返回单元素列表
-
find_all()方法 传入html标签,返回所有匹配的列表,tag对象也可以使用 -
prettify()方法 类似于pprint.pprint()格式化soup对象,增加可读性
find_all()方法
标准写法:
find_all(name , attrs , recursive , string , **kwargs)
简写:可以将soup或tag对象的对象名直接当成是函数使用,它们的用法和find_all()方法完全相同
tag(name , attrs , recursive , string , **kwargs)
soup(name , attrs , recursive , string , **kwargs)
各参数说明:
- name参数(常使用位置参数传入),返回tag对象列表,参数值如下
- 标签名,传入html标签名
- 列表,传入html标签名列表,匹配列表中的所有标签的tag对象
- 正则表达式,需要先导入re,传入
re.compile("正则表达式"),匹配所有符合要求的tag对象 - 函数名,自定义函数
- 字符串
- True,可以匹配任何值,查找到所有的 tag,但是不会返回字符串节点
- 关键字参数**kwargs,常用关键字参数如下:
id="id值"通过id查找tag对象id=True查找所有带有id属性的参数的tag对象href=re.compile("正则表达式")查找所有带有href属性并符合匹配的tag对象class_="类名"通过类名查找tag对象limit=数字限制查找的tag对象的个数
- attrs参数(常作为关键字参数使用),
attrs={"属性名": "属性值"},以字典的方式传入属性名和属性值,查找对应的tag对象 recursive=False设置此参数只查找子节点,默认查找所有后代节点- string参数(常作为关键字参数传入),用法和name参数类似,只是针对的是html中的文本来进行查找,而不是针对标签
find()方法
用法和find_all()相同,只查找第一个tag对象,返回tag对象
css选择器进行查找
css.select("css选择器") 方法 使用css选择器查找,返回tag对象列表
select() 和 select_one()方法,两个方法作用相同,与css.select()用法相同,值查找第一个匹配到的tag对象,返回tag对象