标记信息的三种形式及其比较
作用:
1.标记后的信息形成信息组织结构,增加信息维度
2.用于通信、存储或者展示
3.标记的结构与信息一样具有重要价值
4.标记后的信息更有利于程序理解和运用
THML:hyper text markup language,是万维网信息组织方式
能将声音图像视频嵌入成超文本
通过预定义的<>…>标签形式组织成不同类型的信息
形式:
1.xml:html的扩展通过标签形式构建所有的信息 <>…>表示,有效比例不高
应用:internet上的信息交互与传递
2.json:JavaScript object Notation。有类型的键值对,key:value 适合程序处理
有多个值时可以用,key:[,]表示
应用:移动应用云端和节点的信息通信,无注释
3.yaml 无类型键值对标记信息 简洁 适合程序语言与本身,可读性好
应用:各种系统的配置文件中
name:
-清华
-北大(并列关系)
text:|#表示注释
key:value
key:
-value1
-value2
key:
subkey:subvalue
信息提取的一般方法:
1.完整解析信息的标记形式,再提取关键信息。需要标记解析器,例如bs4的标签树遍历
优点:信息解析准确 缺点:提取繁琐,速度慢
2.无视标记形式,直接搜索关键信息 对信息的文本查找函数即可
优点:提取过程简洁,速度快 缺点:提取结果准确性与信息内容相关。
3.结合1与2 标记解析器+文本查找函数
#实例提取html中所有的url链接
1)搜索出所有标签
2)解析标签格式,提取href后面的链接内容
import requests
from bs4 import BeautifulSoup
r = requests.get(“https://www.python123.io/ws/demo.html”)
demo = r.text
soup = BeautifulSoup(demo,“html.parser”)
for link in soup.find_all(‘a’):
print(link.get(‘href’))
#常见查找函数
<>.find_all(name,attrs,recursive,string,**kwargs)
返回一个列表类型,存储查找的结果
(标签名称的检索,检索属性值字符串(可标注属性检索),
是否对子孙所有节点进行搜索(默认true),)
简洁:(…)==.find_all(…)
soup(…)等价于 soup.find_all(…)
扩展方法:
1.<>.find_parent()
2.<>.find_parents() 先辈中搜索,返回列表类型,同1
<>.find_parent()先辈中返回一个结果,字符串类型,同1
<>.find_next_siblings()后续平行节点搜索,返回一个列表 同1
<>.find_next_sibling()后续平行节点返回一个结果,字符串类型 同1
<>.find_previous_siblings()前序
<>.find_previous_sibling()前序
print(soup.find_all('a'))
print(soup.find_all(['a','b']))
for tag in soup.find_all(True):
print(tag.name)
import re
for tag in soup.find_all(re.compile('b')):
print(tag.name)
print(soup.find_all('p','course'))
print("--------------")
print(soup.find_all(id = 'link1'))
print(soup.find_all(id = 'link'))
print(soup.find_all(id = re.compile('link')))
#正则表达式:搜索词的一部分,提高检索效率
print('==================================')
print(soup('a'))
print(soup.find_all('a'))
print(soup.find_all('a',recursive = False))
print(soup.find_all(string = "Basic Python"))
print(soup.find_all(string = re.compile("python")))
#定向爬取中国大学排名:只针对输入url进行爬取,不扩展爬取
方法:
1.从网络上获取大学排名网页内容
2.提取网页内容中信息到合适的数据结构
3.输出数据结构展示并输出结果(二位列表)
步骤:
1.从网络上获取大学排名网页内容getHTMLText()
2.提取网页内容中信息到合适的数据结构fullUnivList()
3.利用数据结构展示并输出结果printUnivList()
import requests
import bs4
from bs4 import BeautifulSoup
def getHTMLText(url):
try:
r = requests.get(url,timeout = 30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return " "
def fillUnivList(ulist,html):
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[2].string,tds[3].string])
#扩展:“{}:计算机{}的cpu占用率为{}%。”.format("2018-12-31","PYTHON",10)
#字符串中槽{}的顺序,format()中参数的顺序
#format中文对齐问题:宽度是槽设定输出的宽度,当中文字符宽度不够时,采用
#西文字符填充,中西文字符占用的宽度不同。
#解决宽度不够用中文字符填充chr(12288)
# pass
def printUnivList(ulist,num):
tplt = "{0:^10}\t{1:^10}\t{2:^6}\t{3:^10}"
# tplt = "{0:^10}\t{1:{3}^10}\t{2:^6}\t{3:^10}"#不知道为什么pycharm一直报错
#print("{:^10}\t{1:^6}\t{:^10}\t{:^10}".format("排名","学校名称","地区","总分"))
print(tplt.format("排名", "学校名称", "地区", "分数"),chr(12288))
for i in range(num):
u = ulist[i]
#print("{:^10}\t{:^6}\t{:^10}\t{:^10}".format(u[0],u[1],u[2],u[3]))
print(tplt.format(u[0], u[1], u[2], u[3],chr(12288)))
def main():
uinfo = []
url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html'
html = getHTMLText(url)
fillUnivList(uinfo,html)
printUnivList(uinfo,30)#30所
main()