对信息进行标记,反应信息的含义
一、信息标记
- 标记后的信息形成信息组织结构,增加信息维度
- 标记后的信息可用于通信、存储或展示
- 标记的结构与信息一样具有重要价值
- 标记后的信息更利于程序的理解和运用
二、信息标记的种类
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()