Beautiful Soup模块的使用

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.
四种对象:
Tag: 标签对象
NavigableString : 字符内容操作对象
BeautifulSoup: 文档对象
Comment:

下表列出了主要的解析器,以及它们的优缺点

在这里插入图片描述

一.bs4常用操作

下面的代码为打开的文件代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p id="test1"  class="class1" style="color: rebeccapurple">westos1</p>
<p id="'test2" class="class2">文章标题</p>
<div>hello</div>


</body>
</html>

1.获取标签内容

from bs4 import  BeautifulSoup
    # 构造对象
    soup = BeautifulSoup(open('westos.html'), 'html.parser')
    # 获取标签, 默认获取找到的第一个符合的内容
    print(soup.title)
    print(type(soup.title))
    print(soup.p)

在这里插入图片描述

2.获取标签的属性及属性的修改

from bs4 import  BeautifulSoup

# 构造对象
soup = BeautifulSoup(open('westos.html'), 'html.parser')
tag = soup.p   #  每个tag都有自己的名字,通过 .name 来获取
print(tag.name)
print(soup.p.attrs)   #直接”点”取属性
# 获取标签指定属性的内容
print(soup.p['id'])
print(soup.p['class'])
print(soup.p['style'])

在这里插入图片描述

from bs4 import  BeautifulSoup

# 构造对象
soup = BeautifulSoup(open('westos.html'), 'html.parser')
# 获取标签指定属性的内容
print(soup.p['id'])

# 对属性进行修改
soup.p['id'] = 'modifyid'
print(soup.p)
print(type(soup.p))

在这里插入图片描述

3. 获取标签的文本内容

from bs4 import  BeautifulSoup

# 构造对象
soup = BeautifulSoup(open('westos.html'), 'html.parser')


print(dir(soup.title))
print(soup.title.text)
print(soup.title.string)
print(soup.title.name)
print(soup.head.title.string)

在这里插入图片描述

4. 操作子节点

from bs4 import  BeautifulSoup

# 构造对象
soup = BeautifulSoup(open('westos.html'), 'html.parser')
print(soup.head.contents)
print(soup.head.children)
for el in soup.head.children:
    print('--->', el)

在这里插入图片描述

5.面向对象的匹配

from bs4 import  BeautifulSoup

# 构造对象
soup = BeautifulSoup(open('westos.html'), 'html.parser')
# 查找指定的标签内容(指定的标签)
res1 = soup.find_all('p')
print(res1)

在这里插入图片描述

对于正则表达式进行编译, 提高查找速率

from bs4 import  BeautifulSoup
import re

# 构造对象
soup = BeautifulSoup(open('westos.html'), 'html.parser')
# 查找指定的标签内容(指定的标签)--与正则的使用
res1 = soup.find_all(re.compile(r'd+'))
print(res1)

在这里插入图片描述

###仔细查找
import re
from bs4 import  BeautifulSoup

# 构造对象
soup = BeautifulSoup(open('westos.html'), 'html.parser')

# 详细查找标签
print(soup.find_all('p', id='test1'))
print(soup.find_all('p', id=re.compile(r'test\d{1}')))
print(soup.find_all('p', class_="class1"))
print(soup.find_all('p', class_=re.compile(r'class\d{1}')))
# 查找多个标签
print(soup.find_all(['p', 'div']))
print(soup.find_all([re.compile('^d'), re.compile('p')]))


# 内容的匹配
print(soup.find_all(text='文章标题'))
print(soup.find_all(text=re.compile('标题')))
print(soup.find_all(text=[re.compile('标题'), 'Title']))

在这里插入图片描述

6.CSS匹配

import re
from bs4 import  BeautifulSoup
# 构造对象
soup = BeautifulSoup(open('westos.html'), 'html.parser')
# CSS常见选择器: 标签选择器(div), 类选择器(.class1), id选择器(#idname), 属性选择器(p[type="text"])
# 标签选择器(div)
res1 = soup.select("p")
print(res1)
# 类选择器(.class1)
res2 = soup.select(".class2")
print(res2)
# id选择器(#idname)
res3 = soup.select("#test1")
print(res3)
#  属性选择器(p[type="text"]
print(soup.select("p[id='test1']"))
print(soup.select("p['class']"))

在这里插入图片描述
关于bs4的更多操作可以参考以下文档
https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/#id82