爬虫(2)之Beautiful Soup库

学习Beautiful Soup库

  1. Beautiful Soup库的理解:
    Beautiful Soup库是解析、遍历、维护“标签树”的功能库,对应一个HTML/XML文档的全部内容。虽然用Beautiful Soup库解析html简单,但是其匹配效率不高。

  2. BeautifulSoup类的基本元素:

    • Tag 标签,最基本的信息组织单元,分别用<>和</>标明开头和结尾;
    • Name 标签的名字,<p>…</p>的名字是'p',格式:<tag>.name;
    • Attributes 标签的属性,字典形式组织,格式:<tag>.attrs;
    • NavigableString 标签内非属性字符串,<>…</>中字符串,格式:<tag>.string;
    • Comment 标签内字符串的注释部分,一种特殊的Comment类型;
      下面来看一下,BeautifulSoup库的使用方法
  3. 导入库,from bs4 import BeautifulSoup

  4. 创建Beautiful Soup对象 soup = BeautifulSoup(html,‘html.parser’)

#导入bs4库、requests库
from bs4 import BeautifulSoup
import requests
res = requests.get('https://python123.io/ws/demo.html')#demo网址
demo = res.text #抓取的数据
demo

在这里插入图片描述

#解析HTMl页面
#创建soup对象,将抓取的页面数据用bs4解析器来解析
soup = BeautifulSoup(demo, 'html.parser')
#有层次感的输出解析后的HTML页面
print(soup.prettify())

在这里插入图片描述

  1. 标签:通过soup.访问获取
  • 此时要注意的是当HTML文档中存在多个相同的<tag>对应的内容时,soup.返回第一个
#访问标签a
soup.a 

在这里插入图片描述

#访问标签p
soup.p

在这里插入图片描述
2) 标签的名字:每个 都有自己的名字,通过soup..name获取,字符串类型
在这里插入图片描述
3)标签的属性, 一个可以有0或多个属性,字典类型,soup..attrs
在这里插入图片描述
4)Attributes:标签内非属性字符串,格式:soup..string, NavigableString 可以跨越多个层次
在这里插入图片描述
5) NavigableString:标签内字符串的注释部分,Comment是一种特殊类型(有–>)
在这里插入图片描述
6) .prettify()为HTML<>及其内容增加更加’\n’,有层次感的输出

在这里插入图片描述
在这里插入图片描述
7)bs4库将任何HTML输入都变成utf-8编码
在这里插入图片描述
基于bs4库的HTML内容的遍历方法
HTML基本格式:<>…</>构成了所属关系,形成了标签的树形结构.

  • 标签树的下行遍历

    • .contents 子节点的列表,将<tag>所有儿子节点存入列表
    • .children 子节点的迭代类型,与.contents类似,用于循环遍历儿子节点
    • .descendants 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历
  • 标签树的上行遍

    • .parent 节点的父亲标签
    • .parents 节点先辈标签的迭代类型,用于循环遍历先辈节点
  • 标签树的平行遍历

    • .next_sibling 返回按照HTML文本顺序的下一个平行节点标签
    • .previous_sibling 返回按照HTML文本顺序的上一个平行节点标签
    • .next_siblings 迭代类型,返回按照HTML文本顺序的后续所有平行节点标签
    • .previous_siblings 迭代类型,返回按照HTML文本顺序的前续所有平行节点标签

    下行遍历:在这里插入图片描述在这里插入图片描述
    上行遍历:
    在这里插入图片描述
    在这里插入图片描述
    平行遍历
    在这里插入图片描述
    基于bs4库的HTML内容的查找方法

  • <>.find_all(name, attrs, recursive, string, **kwargs)

    • 参数:
    • ∙ name : 对标签名称的检索字符串
    • ∙ attrs: 对标签属性值的检索字符串,可标注属性检索
    • ∙ recursive: 是否对子孙全部检索,默认True
    • ∙ string: <>…</>中字符串区域的检索字符串
      • 简写:
      • <tag>(…) 等价于 <tag>.find_all(…)
      • soup(…) 等价于 soup.find_all(…)
  • 扩展方法:

    • <>.find() 搜索且只返回一个结果,同.find_all()参数
    • <>.find_parents() 在先辈节点中搜索,返回列表类型,同.find_all()参数
    • <>.find_parent() 在先辈节点中返回一个结果,同.find()参数
    • <>.find_next_siblings() 在后续平行节点中搜索,返回列表类型,同.find_all()参数
    • <>.find_next_sibling() 在后续平行节点中返回一个结果,同.find()参数
    • <>.find_previous_siblings() 在前序平行节点中搜索,返回列表类型,同.find_all()参数
    • <>.find_previous_sibling() 在前序平行节点中返回一个结果,同.find()参数
      在这里插入图片描述
      在这里插入图片描述
      中国大学排名定向爬取
#导入库
import requests
from bs4 import BeautifulSoup
import bs4

####### 1.从网络上获取大学排名网页内容

res = requests.get('http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html',timeout=30)
res.raise_for_status()
res.encoding = res.apparent_encoding#这里需要转一下码,否则就会出现乱码现象
text = res.text
text

在这里插入图片描述

soup = BeautifulSoup(text, 'html.parser')#用BeautifulSoup处理一下,看一下结果
soup

在这里插入图片描述
定位我们想要的信息,将信息取出来
在这里插入图片描述

ulist = []#存放想要的结果 
for tr in soup.find('tbody').children:#用先前介绍的查找查找方法
	if isinstance(tr, bs4.element.Tag):#判断是不是bs4元素类型
		tds = tr('td')#取td之间的内容
        ulist.append([tds[0].string, tds[1].string,tds[3].string])#将想要的结果添加到列表中去

设置显示格式,显示结果

tplt = "{0:^10}\t{1:{3}^10}\t{2:10}"
print(tplt.format('排名','学校名称','总分', chr(12288)))
for i in range(50):#输出前50名大学
    u = ulist[i]
    print(tplt.format(u[0],u[1],u[2], chr(12288)))

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值