zoukankan      html  css  js  c++  java
  • 信息组织与提取方法

    信息组织与提取方法

    ​ 标记后的信息可形成信息组织结构,增加了信息的维度

    ​ 标记的结构与信息一样具有重要价值

    ​ 标记后的信息可用于通信、存储或展示

    ​ 标记后的信息更利于程序理解和应用

    HTML的信息标记:

    ​ 文本,超文本(声音、图像、视频)

    HTML通过预定义的<>...</>标签形式组织不同类型的信息。

    信息标记的三种形式:

    ​ XML、JSON、YMAL

    XML(eXtensible Markup Language):

    空元素的缩写形式:<img src = "china.jpg" size = "10"/>

    注释书写形式:<!-- This is a comment , very useful -->

    <name>...</name>

    <name / >

    <!-- -->

    XML实例:

    JSON(JaveScript Object Notation):

    有类型的键值对 key : value

    多值用[ , ]组织

    键值对嵌套用{ , }

    "name" : {

    ​ "newName" : "北京理工大学",

    ​ "oldName" : "延安自然科学院"

    ​ }

    JSON实例:

     

    YAML(YMAL Ain't Markup Language) :

    无类型键值对 key : value

     

    缩进表达所属关系

    name :

    ​ newName : 北京理工大学

    ​ oldName : 延安自然科学院

    减号( - )表达并列关系

    name :

    ​ -北京理工大学

    ​ -延安自然科学院

    |表达整块数据 #表示注释

    key : value

    key : #Comment

    -value1

    -value2

    key :

    ​ subkey : subvalue

    YAML实例:

    三种信息标记形式的比较:

    XML : 最早的通用信息标记语言,可扩展性好,但繁琐

    ​ Internet上的信息交互与传递

    JSON : 信息有类型,适合程序处理(js),较XML简洁

    ​ 移动应用云端和节点的信息通信,无注释

    YMAL : 信息无类型,文本信息比例最高,可读性好

    ​ 各类系统的配置文件,有注释易读

    信息提取:从标记后的信息中提取所关注的内容

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

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

    ​ 优点:信息解析准确;

    ​ 缺点:提取过程繁琐,速度慢;

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

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

    ​ 优点:提取过程简介,速度较快;

    ​ 缺点:提取结果准确性与信息内容相关;

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

    XML、JSON、YAML、搜索, 需要标记解析器及文本查找函数

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

    ​ 思路:搜索到所有的<a>标签;

    ​ 解析<a>标签格式,提取herf后的链接内容;

    复制代码
    >>> from bs4 import BeautifulSoup            
    >>> import requests          
    >>> r = requests.get("http://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)

    返回一个列表类型,存储查找的结果

    ​ name:对标签名称的检索字符串;

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

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

    ​ string : <>...</>中字符串区域的检索字符串。

    >>> soup.find_all('a')
                 
    [<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>, <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>]
    >>> soup.find_all(['a','b'])
                 
    [<b>The demo python introduces several python courses.</b>, <a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>, <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>]

    ​ <tag>(..)等价于<tag>.find_all(..)

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

    ​ 

    实例:“大学排名定向爬虫”

    ​ 输入:大学排名URL链接

    ​ 输出:大学排名信息的屏幕输出(排名,大学名称,总分)

    ​ 技术路线:request-bs4

    ​ 定向爬虫:仅对输入URL进行爬取,不扩展爬取。

    网址:http://www.zuihaodaxue.com/FieldSCI2016.html

    #University rank li.py 
    import requests
    from bs4 import BeautifulSoup
    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:
            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[3].string])
     
    def printUnivList(ulist, num):
        print("{:^10}	{:^6}	{:^10}".format("排名","学校名称","总分"))
        for i in range(num):
            u=ulist[i]
            print("{:^10}	{:^6}	{:^10}".format(u[0],u[1],u[2]))
         
    def main():
        uinfo = []
        url = 'http://www.zuihaodaxue.com/FieldSCI2016.html'
        html = getHTMLText(url)
        fillUnivList(uinfo, html)
        printUnivList(uinfo, 20) # 20 univs
    main()

    运行结果:

    爬取2016年世界大学工科排名前二十:

    网页链接:http://www.zuihaodaxue.com/FieldENG2016.html

    #University Rank
    import requests
    from bs4 import BeautifulSoup
    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:
            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[3].string])
     
    def printUnivList(ulist, num):
        tplt = "{0:^10}	{1:{3}^10}	{2:^10}"
        print(tplt.format("排名","学校名称","总分",chr(12288)))
        for i in range(num):
            u=ulist[i]
            print(tplt.format(u[0],u[1],u[2],chr(12288)))
         
    def main():
        uinfo = []
        url = 'http://www.zuihaodaxue.com/FieldENG2016.html'
        html = getHTMLText(url)
        fillUnivList(uinfo, html)
        printUnivList(uinfo, 20) # 20 univs
    main()

     

  • 相关阅读:
    软件工程的实践项目的自我目标
    transform使用导致元素内字体出现模糊的坑~~~
    nvmw安装,用于控制node版本;
    开章大吉~
    eclipse运行Android项目出现“The connection to adb is down, and a severe error has occured. You must restart adb and Eclipse. ”
    Date对象相关函数使用
    Balsamiq Mockups 注册码
    如何关闭sublime更新提示
    如何在边框中加入文字
    如何用手机测试移动端页面
  • 原文地址:https://www.cnblogs.com/zyh19980816/p/11844772.html
Copyright © 2011-2022 走看看