小白学爬虫(四 信息标记)

对信息进行标记,反应信息的含义

一、信息标记

  1. 标记后的信息形成信息组织结构,增加信息维度
  2. 标记后的信息可用于通信、存储或展示
  3. 标记的结构与信息一样具有重要价值
  4. 标记后的信息更利于程序的理解和运用

二、信息标记的种类

XML:主要以标签为主,是基于HTML发展起来的通用信息表达形式
在这里插入图片描述
在这里插入图片描述
三种格式:
< name>内容< /name>
< /name>
< !-- – >注释

JSON(Javascript Object Notation):使用有类型的键值对
格式为:
“key”:“value”
“key”:[“value”, “value”]
“key”:{
“key”:“value”,
“key”:“value”
}

YAML(Ymal Ain‘t Markup Language):使用无类型的键值对
key:value
|表示整块数据
#表示注释
-表达并列关系
key:
-value
-value

键值对嵌套:
key:
key:value

三、XML、JSON、YAML三者比较

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
XML使用大量标签,有效信息不高,但生活中常用,最早的通用信息标记语言,可扩展性好,但繁琐
JSON使用有类型的键值对(程序接口常用,但无法体验注释),适合程序处理(js),较XML简洁
YAML更简洁,在各类系统的配置文件,文本信息比例最高,可读性好

四、信息提取的一般方法

方法一:完整解析信息的标记形式,再提取关键信息

XML、JSON、YAML

需要标记解析器,例如:bs4库的标签树遍历

优点:信息解析准确
缺点:提取过程繁琐,速度慢

方法二:无视标记形式,直接搜索关键信息

搜索
对信息的文本查找函数即可

优点:提取过程简介,速度较快
缺点:提取结果准确性与信息内容相关

方法三:融合方法,结合形式解析与搜索方法,提取关键信息

XML JSON YAML 搜索

需要标记解析器及文本查找函数

实例:提取HTML中所有URL链接

思路:1)搜索到所有标签
2)解析< a>标签格式,提取href后的链接内容

代码如下:

 from bs4 import BeautifulSoup
 import requests
 r = requests.get("http://www.baidu.com")
 demo = r.text
 soup = BeautifulSoup(demo, "html.parser")
 for link in soup.find_all('a'):
	print(link.get('href'))

结果为:
http://news.baidu.com
http://www.hao123.com
http://map.baidu.com
http://v.baidu.com
http://tieba.baidu.com
http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1
//www.baidu.com/more/
http://home.baidu.com
http://ir.baidu.com
http://www.baidu.com/duty/
http://jianyi.baidu.com/

上述代码涉及到find_all()函数,下面介绍一下这个函数:

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

返回一个列表类型,存储查找的结果
name:对标签名称的检索字符串
例如:

soup.find_all('a')
soup.find_all(['a','b'])

输出所有a标签或者a和b标签的内容

可以添加正则表达式:

#导入正则库
import re
#正则库的使用
for tag in soup.find_all(re.compile('b')):
    print(tag.name)

结果为:body

attrs:对标签属性值的检索字符串,可标注属性检索
例如:

soup.find_all(id='link')
soup.find_all(id=re.compile('link'))

recursive:是否对子孙全部检索,默认为True

#搜索根标签下的a标签,只搜索儿子标签
 soup.find_all('a',recursive=False)

string:<> …</>中字符串区域的检索字符串
例如:

 soup.find_all(string = "basic python")

 soup.find_all(string = re.compile("basic python"))

< tag>(…)等价于< tag>.find_all(…)
soup(…)等价于soup.find_all(…)

find_all()扩展方法

在这里插入图片描述

实例:爬取最好大学排名

描述:
输入:大学排名URL链接
输出:大学排名信息的屏幕输出(排名,大学名称,总分)
技术支持:requests、bs4
定向爬虫:仅对输入URL进行爬取,不扩展爬取

程序结构设计:

步骤1:从网络上获取大学排名网页内容
步骤2:提取网页内容中信息到合适的数据结构
步骤3:利用数据结构展示并输出结果

代码如下:

from bs4 import BeautifulSoup
import requests
import bs4

def getHTMLText(url):

    try:
        r = requests.get(url, timeout = 30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        print("爬虫失败")
        return ""

def fillUnivList(ulist, html):# **{1:{3}^10} 1表示位置(第二列大学名称),{3}表示用第4个参数来填充(第四个参数是chr(12288)表示中文空格),^表示居中,10表示占10个位置**
    soup = BeautifulSoup(html, "html.parser")
    for tr in soup.find('tbody').children:
    #判断一个对象是否是一个已知的标签类型
        if isinstance(tr, bs4.element.Tag):
            tds = tr('td')
            ulist.append([tds[0].string, tds[1].string, tds[3].string])


def printUnivList(ulist, num):
    tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
    print(tplt.format("排名","学校名称","总分",chr(12288)))
    for i in range(num):
        u = ulist[i]
        #print(str(u))
        print(tplt.format(u[0], u[1],u[2],chr(12288)))

def main():
    uinfo = []
    url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html"
    html = getHTMLText(url)
    fillUnivList(uinfo, html)
    printUnivList(uinfo, 20)


main()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值