一 Beautiful Soup
1.定义
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库。它能够通过你喜欢的转换器实现惯用的文档导航、查找、修改文档的方式。
2.Beautiful Soup的使用
安装:
pip install bs4
如何使用
将一段文档传入BeautifulSoup 的构造方法,就能得到一个文档的对象, 可以传入一段字符串或一个文件句柄
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p style="color: #aaffaa" class="class1" id="one">Python最强</p>
<p id="one1">Java最强</p>
<div>hello</div>
</body>
</html>
快速使用:
from bs4 import BeautifulSoup
soup = BeautifulSoup(open("hello.html"),'html5lib')
print(soup)
soup1 = BeautifulSoup('<b class="boldest">Extremely bold</b>','html5lib')
print(soup1)
3.对象的种类
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种: Tag 、NavigableString 、 BeautifulSoup 、Comment
Tag: 标签对象
NavigableString : 字符内容操作对象
BeautifulSoup: 文档对象
Comment:是一个特殊类型的 NavigableString 对象
4.获取标签的内容
from bs4 import BeautifulSoup
#构造对象
soup = BeautifulSoup(open('hello.html'), 'html.parser')
#获取标签, 默认获取找到的第一个符合的内容
print(soup.title)
print(type(soup.title))
print(soup.p)
5.获取标签的属性
print(soup.p.attrs)
#获取标签指定属性的内容
print(soup.p['id'])
print(soup.p['class'])
print(soup.p['style'])
对属性进行修改
soup.p['id'] = 'modifyid'
print(soup.p)
print(type(soup.p))
6.获取标签的文本内容
print(soup.title.text)
print(soup.title.string)
print(soup.title.name)
print(soup.head.title.string)
7.操纵子节点
一个Tag可能包含多个字符串或其它的Tag,这些都是这个Tag的子节点。Beautiful Soup提供了许多操作和遍历子节点的属性
print(soup.head.contents)
print(soup.head.children)
for el in soup.head.children:
print(el)
二 面向对象的匹配
在westos.html中可以随便写点内容
from bs4 import BeautifulSoup
import re
#构造对象
soup = BeautifulSoup(open('westos.html'), 'html.parser')
#查找指定的标签内容
res=soup.p
print(res)
#这样查找的结果就是,只会查找到第一个符合条件的,并不能找到所有符合条件的,这是就要用到 find_all 方法了
res1 = soup.find_all('p')
print(res1)
#与正则表达式的结合使用,首先对于正则表达式进行编译,这样可以提高查找速率
pattern = r'd.+'
pattern = re.compile(pattern)
print(re.findall(pattern, 'this is a dog,only a dog'))
#通过 re 的函数 compile 可以将规则进行编译,这样来提高效率将正则与soup相结合
res1 = soup.find_all(re.compile(r'd+'))
print(res1)
#详细查找标签
print(soup.find_all('p', id='one'))
print(soup.find_all('p', id=re.compile(r'one\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']))
三 CSS的匹配
# 标签选择器(div)
res1 = soup.select("p")
print(res1)
# 类选择器(.class1)
res2 = soup.select(".class1")
print(res2)
# id选择器(#idname)
res3 = soup.select("#one1")
print(res3)
# 属性选择器(p[type="text"]
print(soup.select("p[id='one1']"))
print(soup.select("p['class']"))