最近在看爬虫相关的东西,一方面是兴趣,另外一方面也是借学习爬虫练习python的使用,推荐一个很好的入门教程:中国大学MOOC的《python网络爬虫与信息提取》,是由北京理工的副教授嵩天老师讲的,感受讲的很清晰,课件也很详细。html
学习爬虫,怎么也绕不开requests库和BeautifulSoup库,先说下BeautifulSoup库:python
BeautifulSoup库通俗来讲是【解析、遍历、维护“标签树”(例如html、xml等格式的数据对象)的功能库 】
一个简单的使用BeautifulSoup库的demo:服务器
# coding:utf-8 from bs4 import BeautifulSoup import requests url = 'http://python123.io/ws/demo.html' r = requests.get(url) demo = r.text # 服务器返回响应 soup = BeautifulSoup(demo, "html.parser") """ demo 表示被解析的html格式的内容 html.parser表示解析用的解析器 """ print(soup) # 输出响应的html对象 print(soup.prettify()) # 使用prettify()格式化显示输出
获得一个BeautifulSoup对象后,通常经过BeautifulSoup类的基本元素来提取html中的内容
网络
2.提取html中的信息学习
demo中的html内容以下:url
(1)spa
print(soup.title) # 获取html的title标签的信息 print(soup.a) # 获取html的a标签的信息(soup.a默认获取第一个a标签,想获取所有就用for循环去遍历) print(soup.a.name) # 获取a标签的名字 print(soup.a.parent.name) # a标签的父标签(上一级标签)的名字 print(soup.a.parent.parent.name) # a标签的父标签的父标签的名字
(2)code
print('a标签类型是:', type(soup.a)) # 查看a标签的类型 print('第一个a标签的属性是:', soup.a.attrs) # 获取a标签的全部属性(注意到格式是字典) print('a标签属性的类型是:', type(soup.a.attrs)) # 查看a标签属性的类型 print('a标签的class属性是:', soup.a.attrs['class']) # 由于是字典,经过字典的方式获取a标签的class属性 print('a标签的href属性是:', soup.a.attrs['href']) # 一样,经过字典的方式获取a标签的href属性
(3)xml
print('第一个a标签的内容是:', soup.a.string) # a标签的非属性字符串信息,表示尖括号之间的那部分字符串 print('a标签的非属性字符串的类型是:', type(soup.a.string)) # 查看标签string字符串的类型 print('第一个p标签的内容是:', soup.p.string) # p标签的字符串信息(注意p标签中还有个b标签,可是打印string时并未打印b标签,说明string类型是可跨越多个标签层次)
介绍一下find_all()方法:htm
经常使用经过find_all()方法来查找标签元素:<>.find_all(name, attrs, recursive, string, **kwargs) ,返回一个列表类型,存储查找的结果
• name:对标签名称的检索字符串
• attrs:对标签属性值的检索字符串,可标注属性检索
• recursive:是否对子孙所有检索,默认True
• string:<>…</>中字符串区域的检索字符串
(1)
print('全部a标签的内容:', soup.find_all('a')) # 使用find_all()方法经过标签名称查找a标签,返回的是一个列表类型 print('a标签和b标签的内容:', soup.find_all(['a', 'b'])) # 把a标签和b标签做为一个列表传递,能够一次找到a标签和b标签
(2)
for t in soup.find_all('a'): # for循环遍历全部a标签,并把返回列表中的内容赋给t print('t的值是:', t) # link获得的是标签对象 print('t的类型是:', type(t)) print('a标签中的href属性是:', t.get('href')) # 获取a标签中的url连接
(3)
for i in soup.find_all(True): # 若是给出的标签名称是True,则找到全部标签 print('标签名称:', i.name) # 打印标签名称
(4)
print('href属性为http..的a标签元素是:', soup.find_all('a', href='http://www.icourse163.org/course/BIT-268001')) # 标注属性检索 print('class属性为title的标签元素是:', soup.find_all(class_='title')) # 指定属性,查找class属性为title的标签元素,注意由于class是python的关键字,因此这里须要加个下划线'_' print('id属性为link1的标签元素是:', soup.find_all(id='link1')) # 查找id属性为link1的标签元素
(5)
print(soup.head) # head标签 print(soup.head.contents) # head标签的儿子标签,contents返回的是列表类型 print(soup.body.contents) # body标签的儿子标签 """对于一个标签的儿子节点,不只包括标签节点,也包括字符串节点,好比返回结果中的 \n"""
(6)
print(len(soup.body.contents)) # 得到body标签儿子节点的数量 print(soup.body.contents[1]) # 经过列表索引获取第一个节点的内容
(7)
print(type(soup.body.children)) # children返回的是一个迭代对象,只能经过for循环来使用,不能直接经过索引来读取其中的内容 for i in soup.body.children: # 经过for循环遍历body标签的儿子节点 print(i.name) # 打印节点的名字