【5】基础知识类---BeautifulSoup4

BeautifulSoup4

一、入门

1.基本介绍

用处:和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。

比较:

抓取工具 速度 使用难度 安装难度
正则re 最快 困难 无(内置)
Beautiful Soup 最简单 简单
lxml(xpath) 简单 简单

2.入门使用

【基础】

bs4的入门:
0. 安装: pip install beautifulsoup4
1. 导入模块:from bs4 import BeautifulSoup
2. 创建BeautifulSoup对象
    参数一:解析的文本内容
    参数二:使用的解析器,一般为lxml(必须添加,否则会发出警告)
3. 格式化输出 soup 对象的内容

【示例】

"""
bs4的入门:
0. 安装: pip install beautifulsoup4
1. 导入模块:from bs4 import BeautifulSoup
2. 创建BeautifulSoup对象
    参数一:解析的文本内容
    参数二:使用的解析器,一般为lxml(必须添加,否则会发出警告)
3. 格式化输出 soup 对象的内容
"""
# 1. 导入模块
from bs4 import BeautifulSoup

html = """
The Dormouse's story

The Dormouse's story

Once upon a time there were three little sisters; and their names were , Lacie and Tillie; and they lived at the bottom of a well.

...

"""
# 2. 创建BeautifulSoup对象 # 注意点: # 1.填写解析库 lxml(否则会报错) # 2.标签自动补全 soup = BeautifulSoup(html, 'lxml') # 3. 格式化输出 soup 对象的内容 print(soup.prettify())

二、基本使用

1.最重要的方法 & 获取子元素列表

格式 说明
(1)节点的选择 soup对象.标签名
(2)文本内容获取 soup对象.标签名.string
soup.标签名.get_text()
(3)属性获取 soup.标签名.get()
soup.标签名.attrs
(4)获取子元素列表 soup.标签名.contents
soup.标签名.children

【示例】

# 1. 导入模块
from bs4 import BeautifulSoup

html = """
The Dormouse's story

The Dormouse's story

Once upon a time there were three little sisters; and their names were , Lacie and Tillie; and they lived at the bottom of a well.

...

"""
# 2. 创建BeautifulSoup对象 # 注意点: # 1.填写解析库 lxml(否则会报错) # 2.标签自动补全 soup = BeautifulSoup(html, 'lxml')
# (1)节点选择
# 格式:soup对象.标签名(默认获取一条对象)
print(soup.title)
print(soup.p)
# (2)文本内容获取 --> get_text()
# 格式:soup对象.标签名.string (获取到一个bs4中NavigableString对象)
print(soup.title.string)
print(type(soup.title.string))  #

# 格式:soup.标签名.get_text() (获取到字符串 str)
print(soup.title.get_text())
print(type(soup.title.get_text()))  # 
# (3)属性获取  --> get()
# A. 获取属性内容
# 格式:soup.标签名.get()
# 注意:如果是class属性,返回的是 list ;如果是name,返回的是 str.
p = soup.p
print(p.get('name'))
print(type(p.get('name')))  # 

print(p.get('class'))
print(type(p.get('class')))  # 

# B. 获取所有属性名(字典)
# 格式:soup.标签名.attrs
print(p.attrs)  # {'class': ['title'], 'name': 'dromouse'}

# 3. 格式化输出 soup 对象的内容
print(soup.prettify())
# (4)获取子元素
# 获取所有子标签
# A. 格式:soup.标签名.contents  (获取一个列表)
print(soup.body.contents)
print(type(soup.body.contents))  # 

# B. 格式:soup.标签名.children (获取一个迭代器,说明可以使用for循环)
print(soup.body.children)
print(type(soup.body.children))  # 

children= soup.body.children
for child in children:
    print(child)

2.查询find & find_all函数

【基本点】

【find函数】
1. 标签查询: soup.find("标签名") 
2. 属性查询: soup.find(attrs={"属性名""属性值"}) 或 soup.find("属性名"="属性值"3. 文本内容查询:soup.find(text='文本内容')
4. 混合使用,一起查询
【find_all函数】
1. 标签查询: soup.find_all(["标签名1","标签名2"]) 
2. 属性查询: soup.find_all(attrs={"属性名""属性值"}) 或 soup.find_all("属性名"="属性值"3. 文本内容查询:soup.find_all(text='文本内容')
4. 混合使用,一起查询

【find & find_all函数的区别】

【findall函数】
# 1.返回值是一个列表
# 2.可以多标签查询
# 3.可以多条件查询

【示例】

(1)find函数

"""
【find函数】
1. 标签查询: soup.find("标签名")
2. 属性查询: soup.find(attrs={"属性名":"属性值"}) 或 soup.find("属性名"="属性值")
3. 文本内容查询:soup.find(text='文本内容')
"""
# 1. 导入模块
from bs4 import BeautifulSoup

html = """
The Dormouse's story

The Dormouse's story

Once upon a time there were three little sisters; and their names were , Lacie and Tillie; and they lived at the bottom of a well.

...

"""
# 2. 创建BeautifulSoup对象 soup = BeautifulSoup(html, 'lxml') # (1). 标签查询 # 格式: soup.find("标签名")==>soup.标签名 (返回一条标签对象) # result = soup.find('title') result = soup.find('p') print(result) print(type(result)) #
# (2). 属性查询
# 格式: soup.find(attrs={"属性名":"属性值"})  # 返回bs4.element.Tag标签对象
result = soup.find(
    attrs={
        'class': "story"
    }
)
print(result)
print(type(result))  # 

# 属性查询可以变成关键词查询
result = soup.find(id='link1')
print(result)
# (3). 文本内容查询
# 格式: soup.find(text='文本内容') (返回具体的文本内容bs4.element.NavigableString)
result = soup.find(text='...')
print(result)
print(type(result))  # 
# (4). 混合使用,一起查询
result = soup.find(
    'a',
    attrs={
        "id": 'link1'
    },
)
print(result)

(2)find_all函数

"""
【findall函数】
返回值是一个列表
# 可以多标签查询
# 可以多条件查询
"""
# 1.返回值是一个列表
result = soup.find_all(
    attrs={
        'class':'sister'
    }
)
print(result)
print(type(result))  #
for item in result:
    print(item)

# 2.可以多标签查询
# 3.可以多条件查询
# 注意: soup.find(['b','p'])只能查询出最先匹配的标签
result = soup.find_all(
    ['b', 'a'],
    attrs={
        "class": 'sister',
        "id": "link1"
    }
)
print(result)

3.查询select函数

【基本点】

"""
【select函数】
支持 css 选择器:
(1)标签选择器(标签名)
(2)类选择器(点.)
(3)id选择器(#号)
(4)层级选择器
    a. 后代选择器(空格\s)
    b. 子代选择器(大于号>)
    c. 平级选择器(或)(逗号,)
(5)属性选择器(标签名[属性名="属性值"])
# 与xpath区别是@

样式选择器(并):(无)
# 注意点:返回列表
"""

【示例】

# 1. 导入模块
from bs4 import BeautifulSoup

html = """
The Dormouse's story

The Dormouse's story

Once upon a time there were three little sisters; and their names were , Lacie and Tillie; and they lived at the bottom of a well.

...

"""
# 2. 创建BeautifulSoup对象 soup = BeautifulSoup(html, 'lxml') # select 支持css 选择器 # 支持 css 样式选择器: # (1)标签选择器 # 格式:soup.select("标签名") result = soup.select('p')
# (2)类选择器(.号)
# 格式:soup.select(".class类名")
result = soup.select(".title")
# (3)id选择器(#号)
# 格式: soup.select("#id名")
result = soup.select("#link1")
# (4)层级选择器
#     a. 后代选择器(空格)
#     包括子孙级
result = soup.select('body a')
#     b. 子代选择器(>号)
result = soup.select('head > title')
#     c. 平级选择器(,号)  (或)
result = soup.select('b,a')
#     d. 样式选择器(无)   (并)
result = soup.select('.title.title2')
# (5)属性选择器
# 格式: soup.select('标签名[属性名="属性值"]')
# 注意:区别是 @
# xpath: //p[@name="dromouse"]'
# css: p[name="dromouse"]

result = soup.select('p[name="dromouse"]')
print(result)

4.四大对象

对象名 说明
BeautifulSoup 文档对象
Tag 标签对象(属性、文本内容)
NavigableString 内容字符串对象
Comment 注释对象
# 导入模块
from bs4 import BeautifulSoup

html = """
The Dormouse's story

The Dormouse's story

Once upon a time there were three little sisters; and their names were , Lacie and Tillie; and they lived at the bottom of a well.

...

"""
# 创建BeautifulSoup对象 soup = BeautifulSoup(html, 'lxml') # (1)BeautifulSoup 文档对象:bs4.BeautifulSoup print(type(soup)) # # (2)Tag 标签对象(属性、文本内容): bs4.element.Tag print(type(soup.title)) # # (3)NavigableString 内容字符串对象: bs4.element.NavigableString print(type(soup.title.string)) # # (4)Comment 注释对象: bs4.element.Comment print(type(soup.a.string)) #

你可能感兴趣的:(BaseKonwledge)