当前位置: 代码迷 >> 综合 >> Python网络爬虫——Beautiful Soup库
  详细解决方案

Python网络爬虫——Beautiful Soup库

热度:59   发布时间:2023-10-09 14:27:51.0

Beautuful Soup库的安装

Beautuful Soup
安装过程不再赘述,直接看官方文档,看不懂直接百度即可。

Beautiful Soup库的基本元素

Beautiful Soup是能够解析HTML和XML文件的功能库

Beautiful Soup库解析器

解析器 使用方法 条件
bs4的HTML解析器 BeautifulSoup(mk, ‘html.parser’) 安装bs4库
lxml的HTML解析器 BeautifulSoup(mk, ‘lxml’) pip install lxml
bs4的XML解析器 BeautifulSoup(mk, ‘xml’) pip install lxml
html5lib的解析器 BeautifulSoup(mk, ‘html5lib’) pip install html5lib

Beautiful Soup类的基本元素

基本元素 说明
Tag 标签,最基本的信息组织单元,分别用<></>标明开头和结尾
Name 标签的名字,<p></p> 的名字是“p”,格式:<tag>.name
Attributes 标签的属性,字典形式组织,格式:<tag>.attrs
NavigableString 标签内非属性字符串,<>...</>中字符串,格式:<tag>.string
Comment 标签内字符串的注释部分,一种特殊的Comment类型

基于bs4库的HTML内容遍历方法

下行遍历

属性 说明
.contents 子节点的列表,将<tag>所有的儿子结点存入列表
.children 子节点的迭代类型,与contents类似,用于循环遍历儿子结点
.descendants 子孙结点的迭代类型,包含所有子孙结点,用于循环遍历

上行遍历

属性 说明
.parent 结点的父亲标签
.parents 结点先辈标签的迭代类型,用于循环遍历先辈结点
soup = BeautifulSoup(demo, "html.parser")
for parent in soup.a.parents:if parent is None:print(parent)else:print(parent.name)

平行遍历

属性 说明
.next_sibling 返回按照HTML文本顺序的下一个平行节点标签
.previous_sibling 返回按照HTML文本顺序的上一个平行节点标签
.next_siblings 迭代类型,返回按照HTML文本顺序的后序所有平行节点标签
.previous_siblings 迭代类型,返回按照HTML文本顺序的前序所有平行节点标签

所有的平行遍历必须发生在同一个父亲结点下

基于bs4库的HTML格式化

bs4库中提供了prettify()方法

from bs4 import BeautifulSoup
soup = BeautifulSoup(demo, "html.parser")
print(soup.prettify())

基于bs4库的HTML内容超找方法

重点方法:
find_all(name, attrs, recursive, string, **kwargs)
返回一个列表类型,存储查找的结果。

  • name :对标签名称的检索字符串
    soup.find_all('a') 返回所有a标签的
    soup.find_all(['a','b']) 返回所有的a标签和b标签
    for tag in soup.find_all(re.compile('b')) 返回所有的b开头的标签

  • attrs : 对标签属性值的检索字符串,可标注属性检索
    soup.find_all('p','course') 查找p标签中包含course属性值
    soup.find_all('id=link') 查找id属性等于link的值的元素

  • recursive : 是否对子孙全部检索,默认True

  • string : <>...</> 中字符串区域的检索字符串
    soup.find_all(string = "Basic Python") 标签之间字符串为Basic Python的元素

扩展方法:

方法 说明
<>.find() 搜索且只返回一个结果,字符串类型,同find_all()参数
<>.find_parents() 在先辈节点中搜索,返回列表类型,同find_all()参数
<>.find_parent() 在先辈中返回一个结果,字符串类型,同find()参数
<>.find_next_siblings() 在后续平行节点中搜索,返回列表类型,同find_all()参数
<>.find_next_sibling() 在后续平行节点中返回一个结果,字符串类型,同find()参数
<>.find_previous_siblings() 在前序平行节点中搜索,返回列表类型,同find_all()参数
<>.find_previous_sibling() 在前序平行节点中返回一个结果,字符串类型,同find()参数