【笔记】BeautifulSoup学习笔记

前言

Python3通过BeautifulSoup实现HTML和XML数据解析

下载依赖

1
2
3
pip3 install beautifulsoup4
pip3 install lxml
pip3 install html5lib

引入依赖

1
from bs4 import BeautifulSoup

创建soup对象

传递HTML文件进行解析

'lxml':定义解析器

1
soup = BeautifulSoup(open("index.html"), 'lxml')

传递HTML字符串进行解析

1
soup = BeautifulSoup("<html></html>", 'lxml')

选择器

节点选择器

  • 根据HTML标签名获取节点对象
  • 多个同名节点只得到第一个节点
  • 返回bs4.element.Tag对象

html:节点名

1
soup.html

多级节点

1
soup.html.head

关联选择

子节点

返回列表
1
soup.html.contents
返回生成器
1
soup.html.children

子孙节点

1
soup.html.descendants

父节点

1
soup.html.parent

祖先节点

1
soup.html.parents

兄弟节点

后面的一个节点
1
soup.html.next_sibling
后面的所有节点
1
soup.html.next_siblings
前面的一个节点
1
soup.html.previous_sibling
前面的所有节点
1
soup.html.previous_siblings

CSS选择器

1
soup.select("html")
1
soup.select("#id")
1
soup.select(".class")
1
soup.select("html #id .class")

嵌套选择

1
soup.select("#id > #id")
1
soup.select("#id").select("#id")

方法选择器

  • 根据当前节点下的节点来搜索

find():返回第一个符合条件的节点对象
find_all():返回所有符合条件的节点对象列表
find_parent():返回第一个符合条件的父节点对象
find_parents():返回所有符合条件的父节点对象
find_next_sibling():返回第一个符合条件的兄弟节点对象
find_next_siblings():返回所有符合条件的兄弟节点对象
find_previous_sibling():返回第一个符合条件的兄弟节点对象
find_previous_siblings():返回所有符合条件的兄弟节点对象
find_next():返回第一个符合条件的后续节点对象
find_all_next():返回所有符合条件的后续节点对象
find_previous():返回第一个符合条件的前置节点对象
find_all_previous():返回所有符合条件的前置节点对象

传递name参数

  • 如果传递的是字符串,则默认是标签名搜索
1
soup.find("")
1
soup.find(name="")
  • 如果传递的是字符串列表,则表示与列表的任意一个元素作为标签名匹配
1
soup.find(["", ""])
  • 如果传递的是正则表达式,则会以match()函数来匹配结果
1
soup.find(re.compile(""))
  • 如果传递的是True,递归的返回所有的标签
1
soup.find(True)

传递attrs参数

  • 通过属性名和属性值进行检索
1
soup.find(attrs={"class": ""})

传递kwargs参数

  • 通过属性名和属性值进行检索
1
soup.find(id="")
  • class是Python中的关键字,所以需要改用class_
1
soup.find(class_="")

传递text参数

  • 通过关键字进行检索
1
soup.find(text="")
  • 与其他参数混合使用
1
soup.find(name="", text="")

limit参数

  • 限制返回结果数量
  • 只有返回列表的方法才有此参数
1
soup.find_all(name="", limit=1)

recursive参数

  • 限制是否递归,默认为True,表示递归操作,False表示不递归操作
1
soup.find(name="", recursive=True)
  • 如果返回列表的方法,使用recursive=False后可能会返回[]
  • 如果返回对象的方法,使用recursive=False后可能会返回None

获取节点名

  • 返回字符串
1
soup.html.name

获取节点属性

  • 返回节点所有属性的字典
  • class的值是列表
1
soup.html.attrs["class"]

获取节点内容

  • 返回字符串
1
soup.html.string
1
soup.html.get_text()

完成

参考文献

哔哩哔哩——博学谷