标记信息形式&&提取方法&&定向爬取中国最好大学排名

标记信息的三种形式及其比较

作用:
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()

猜你喜欢

转载自blog.csdn.net/qq_32145097/article/details/89952979