一、BeautifulSoup简介
Xpath和BeautifulSoup都是基于DOM的一种操作模式。
不同点在于加载文档对象模型DOM时出现的文档节点遍历查询操作过程,Xpath在进行遍历操作时针对描述语言指定的
语法结构进行局部DOM对象树的遍历得到具体的数据,但是BS4在操作过程中,会将整个文档树进行加载然后进行查询匹配
操作,使用过程中消耗资源较多,处理性能相对Xpath较低那么为什么要用BS4呢?因为,它,足够简单!
二、BeautifulSoup安装
- pip install bs4
三、BeautifulSoup基本使用
- from bs4 import BeautifulSoup
1)从本地文件加载html
- soup = BeautifulSoup(open("./soup_test.html",encoding='utf-8'),"lxml")
2)从网页爬取到的html数据
- soup = BeautifulSoup(html,"lxml")
四、BeautifulSoup基本语法
print(soup.title) # <title>文章标题</title>
print(soup.p) # <p>姓名:<span id="name">大牧</span></p> # 只返回第一个匹配到的标签对象
print(soup.span) # <span id="name">大牧</span>
print(soup.p.attrs) # {}:得到属性和值的字典
print(soup.span.attrs) # {'id': 'name'}:得到属性和值的字典
print(soup.span['id']) # name:得到指定属性的值
soup.span['id'] = "real_name"
print(soup.span['id']) # real_name : 可以方便的在BS4中直接对文档进行修改
print(soup.a.string) # 获取都没有注释的内容 或者 获取都注释的内容 否则为None
print(soup.a.get_text()) # 只能获取没有注释的内容 有注释的无法获取
print(soup.contents)# 得到文档对象中所有子节点
print(soup.div.contents)# 得到匹配到的第一个div的子节点列表
print(soup.div.children)# 得到匹配到的第一个div的子节点列表迭代器
# for e1 in soup.div.children:
# print("-->", e1)
print(soup.div.descendants)# 得到匹配到的第一个div的子节点迭代器,所有后代节点单独一个一个列出
# for e2 in soup.div.descendants:
# print("==>", e2)
print(soup.find('a')) # 查找第一个a标签
print(soup.find('a',id='hong')) # 查找id为hong的第一个a标签
print(soup.find_all('a')) # 查找所有的a标签,返回一个列表
print(soup.find_all(['a','span','li'])) # 查找所有的a、span、li标签,返回一个列表
print(soup.find_all(['a','span','li'],class='taohua')) # 查找所有的有class属性值为taohua的a、span、li标签
print(soup.find_all(['a','span','li'],limit=3)) # 查找所有的a、span、li标签,限制取前3条,返回一个列表
# 1. CSS 标签选择器:根据标签名称查询标签对象
res1 = soup.select("span")
print(res1)
# 2. CSS ID选择器:根据ID查询标签对象
res2 = soup.select("#gender")
print(res2)
# 3. CSS 类选择器:根据class属性查询标签对象
res3 = soup.select(".intro")
print(res3)
# 4. CSS 属性选择器
res41 = soup.select("span[id]")
print(res41)
res42 = soup.select("span[id='gender']")
print(res42)
# 5. CSS 包含选择器
res5 = soup.select("p span#name")
print(res5)
# 6. 获取标签内容
res6 = soup.select("p > span.intro")
print(res6[0].string)
print(res6[0].getText())
网友评论