BeautifulSoup 库是学习python的一个用来进行解析,遍历,维护html,xml文档的第三方库。
学习本内容需有基础的 html 知识。
BeautifulSoup 库也叫BeautifulSorp4 或者bs4 ,主要调用BeautifulSoup类。
引用方式:
import bs4 或 from bs4 import BeautifulSoup
- BeautifulSoup库的基本元素
- BeautifulSoup 库的解析器
- BeautifulSoup 类的基本元素
接下来使用BeautifulSoup 先尝试一下。
import requests
from bs4 import BeautifulSoup
url = "http://www.baidu.com"
r = requests.get(url,timeout = 30) # 请求网页信息
demo = r.text
Beaful_text = BeautifulSoup(demo,"html.parser") # 将网页源代码解析
print(Beaful_text.prettify())
- prettify() 方法的使用
使用BeautifulSoup 中的 prettify 方法,需要建立BeautifulSoup 类的对象。
Beaful_text = BeautifulSoup(demo,"html.parser") # 建立了一个BeautifulSoup类对象
print(Beaful_text.prettify()) # 使用prettify 方法输出网页源代码
print(type(Beaful_text)) # <class 'bs4.BeautifulSoup'>
Tag 标签的使用
html 与xml 文档就是由最基本的元素——标签组成。分别用“<>”和”<反斜杠>”标记开头与结尾
// 因为csdn的创作窗口也是html格式,所以/ 不能包含在<>内,还请见谅。。
Tag 的 name(名字)
url = "http://www.baidu.com"
r = requests.get(url,timeout = 30)
demo = r.text
Beaful_text = BeautifulSoup(demo,"html.parser")
print(Beaful_text.a.name) # 获取标签a的上一层标签的名字
print(Beaful_text.a.parent.name) # 获取便签a的名字
Tag 的 attrs(属性)
url = "http://www.baidu.com"
r = requests.get(url,timeout = 30)
demo = r.text
Beaful_text = BeautifulSoup(demo,"html.parser")
print(Beaful_text.a.attrs) # 获取标签a的属性
print(Beauful_text.a.attrs['href'])
'''
{'href': 'http://news.baidu.com', 'name': 'tj_trnews', 'class': ['mnav']}
http://news.baidu.com
'''
Tag 的 NavigableString
标签内非属性字符串,标签中字符串,格式:<标签>.string
url = "http://www.baidu.com"
r = requests.get(url,timeout = 30)
r.encoding = r.apparent_encoding # 将编码格式进行转化
demo = r.text
Beaful_text = BeautifulSoup(demo,"html.parser")
print(Beaful_text.a.string) # 获取<>..</> 中的字符串
Tag 的 Comment (注释)
# html注释格式为 <!--注释内容-->
url = "http://www.baidu.com"
r = requests.get(url,timeout = 30)
r.encoding = r.apparent_encoding
demo = r.text
Beaful_text = BeautifulSoup(demo,"html.parser")
print(Beaful_text.a.comment) # 获取注释内容
标签树的遍历
我们学习了BeautifulSoup库的基本知识点后,进行进一步的深入学习。
上面提到,html 与 xml 文档是由标签组成了,而标签中存在着的逻辑关系就像一棵大树,最底层是Document ,再往下是html或者xml,再往下是head和body······
这些东西构成了我们所看见的网页。为了得到想要的信息,我们有时候寻找的标签很多,因此便需要相应的遍历算法来解决这一问题。
BeautifulSoup库中提供三种遍历方法:上行遍历,平行遍历,下行遍历
- 下行遍历
Beaful_text = BeautifulSoup(demo,"html.parser")
print(len(Beaful_text.head.contents)) # 统计树的成熟
print(Beaful_text.head.contents[1]) # 输出第一个层标签的信息
# 使用for循环下行遍历节点
for i in Beaful.head.children: # 遍历儿子节点
print(i)
for i in Beaful.head.descendants: # 遍历子孙节点
print(i)
- 上行遍历
Beaful_text = BeautifulSoup(demo,"html.parser")
print(Beaful_text.title.parent) # 输出上一层标签的信息
# 使用for循环上行遍历节点
for i in Beauful.title.parents:
if i is None: # 遍历所有节点,包括soup本身
print(i)
else:
print(i.name)
- 平行遍历
平行遍历发生在同一个父节点下,不同父节点下不能使用平行遍历。
Beaful_text = BeautifulSoup(demo,"html.parser")
print(Beaful_text.a.next_siblings)
# 使用for循环平行遍历节点
forsibling insoup.a.next_sibling: # 遍历后续节点
print(sibling)
forsibling insoup.a.previous_sibling: # 遍历前续节点
print(sibling)
实例
在学习** BeautifulSoup 和 **requests 库后,我们选取一个网页进行爬虫训练。
选取了新东方留学频道里面的一篇文章,我们要爬取网页中展示的大学,并进行排序。
import requests
from bs4 import BeautifulSoup
tem = "a" # 定义tem 全局变量
def Get_webtext(url): # 获取网页源代码
try:
r = requests.get(url,timeout = 30)
r.raise_for_status()
r.encoding = r.apparent_encoding
soup = BeautifulSoup(r.text, 'html.parser')
return soup
except:
return "Erro"
def Get_information(web_text): # 从源代码中获取需要的信息
count = 0 # 大学排名计数器
for i in web_text.body.descendants:
if i.name =="span": # 获取标签“span”的信息
if tem == str(i.string): # 判断上一条span信息与这一条是否相同
continue
if Judge(str(i.string)) !=" ": # 判断span的信息是否符合要求
count += 1
print("{} {}".format(count, i.string)) # 输出排名
tem = str(i.string)
def Judge(information): # 判断span信息是否符合要求
'''
若信息中有“大学”或者“学院”,则返回信息,否则返回空格
'''
if "大学" in information:
return information
elif "学院" in information:
return information
else:
return " "
if __name__ == '__main__':
url = "http://goabroad.xdf.cn/201711/10729693.html"
web_text = Get_webtext(url)
Get_information(web_text)
运行结果
'''
1 斯坦福大学 Stanford University
2 麻省理工学院 Massachusetts Institute of Technology
3 牛津大学 University of Oxford
4 苏黎世联邦理工学院 ETH Zurich – Swiss Federal Institute of Technology Zurich
5 剑桥大学 University of Cambridge
6 加州理工学院 California Institute of Technology
7 卡内基梅隆大学 Carnegie Mellon University
8 佐治亚理工学院 Georgia Institute of Technology
9 帝国理工学院 Imperial College London
10 洛桑联邦理工学院 École Polytechnique Fédérale de Lausanne
11 哈佛大学 Harvard University
12 普林斯顿大学 Princeton University
13 新加坡国立大学 National University of Singapore
14 爱丁堡大学 University of Edinburgh
15 康奈尔大学 Cornell University
16 慕尼黑理工大学 Technical University of Munich
17 华盛顿大学 University of Washington
18 哥伦比亚大学 Columbia University
19 清华大学 Tsinghua University
'''
一天的工作终于完了。。。