zoukankan      html  css  js  c++  java
  • Python中的信息标记与提取

    一、信息标记

    1、信息标记的意义

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

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

    (3)标记的结构和信息一样具有重要价值

    (4)标记后的信息更利于程序理解和运用

    HTML(Hyper Text Markup Language)超文本标记语言,是WWW(Word Wide Web)的信息组织方式,可以将声音、图像、视频等超文本信息嵌入文本中。通过预定义的<>…</>标签形式组织不同类型的信息。

    2、信息标记的三种形式

    (1)XML

    XML(eXtensible Markup Language),可扩展标记语言

    一般形式 <name>…</name>

    1 <img src = “china.jpg” size = “10”>中国</img>

    空元素的缩写形式 <name />

    1 <img src = “china.jpg” size = “10” />

    注释书写形式 <!-- -->

    1 <!-- This is a comment, very useful -->

    (2)JSON

    JSON(JavaScript Object Notation),JavaScript对象简谱

    有类型的键值对 key:value

    单个值 “key”:”value”

    1 “name”:”北京理工大学”

    多个值用[,] “key”:[“value1”,”value2”

    1 “name”:[ ”北京理工大学”,”延安自然科学院”]

    嵌套用{,} “key”:{“subkey”:”subvalue”}

    1 “name”:{
    2         “newName”:”北京理工大学”,
    3         “oldName”:”延安自然科学院”
    4         }

    (3)YAML

    YAML(YAML Ain’t Markup Language)

    无类型的键值对 key:value

    单个值 key:value

    1 name:北京理工大学

    多个值 -表达并列关系

    1 key:
    2     -value1
    3     -value2
    4 name:
    5     -北京理工大学
    6     -延安自然科学院

    嵌套

    key:

           subkey:subvalue

    1 name:
    2     newName:北京理工大学
    3     oldName:延安自然科学院

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

    content:| #comment

      value

    1 text:| #学校简介
    2     北京理工大学(Beijing Institute of Technology)隶属于中华人民共和国工业和信息化部,是全国重点大学,首批进入国家“211工程”、“985工程”,首批进入世界一流大学建设高校A类行列,入选学位授权自主审核单位、高等学校学科创新引智计划、高等学校创新能力提升计划、卓越工程师教育培养计划、国家建设高水平大学公派研究生项目、国家大学生创新性实验计划、国家级大学生创新创业训练计划、新工科研究与实践项目、中国政府奖学金来华留学生接收院校、全国深化创新创业教育改革示范高校、首批高等学校科技成果转化和技术转移基地,工业和信息化部高校联盟、中国人工智能教育联席会成员。

     3、三种信息标记形式的比较

    标记语言 特点 应用
    XML 最早的通用信息标记语言,可扩展性好,但繁琐 Internet上的信息交互与传递
    JSON 信息有类型,适合程序处理(js),较XML简洁 移动应用云端和节点的信息通信,无注释
    YAML 信息无类型,文本信息比例最高,可读性好 各类型系统的配置文件,有注释易读

    (1)XML实例

     1 <person>
     2     <firstName>Tian</firstName>
     3     <lastName>Song</lastName>
     4     <address>
     5         <streetAddr>中关村南大街5号</streetAddr>
     6         <city>北京市</city>
     7         <zipcode>100081</zipcode>
     8     </address>
     9     <prof>Computer System</prof><prof>Security</prof>
    10 </person>

    (2)JSON实例

     1 {
     2     “firstName”:”Tian”,
     3     “lastName”:”Song”,
     4     “address”:{
     5                 “strettAddr”:”中关村南大街5号”,
     6                 “city”:”北京市”,
     7                 “zipcode”:”100081 8             },
     9     “prof”:[“Computer System”,”Security”]
    10 }

    (3)YAML实例

    1 firstName:Tian
    2 lastName:Song
    3 address:
    4     streetAddr:中关村南大街5号
    5     city:北京市
    6     zipcode:100081
    7 prof:
    8     -Computer System
    9     -Security

    二、信息提取

    方法 手段 条件 优点 缺点

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

    XML、JSON、YAML

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

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

    无视标记形式,直接搜索关键信息

    搜索

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

    提取过程简洁,速度较快 提取结果准确性与信息内容相关

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

    XML、JSON YAML、搜索

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

     ×  ×

    基于bs4库的HTML内容查找方法

    以"http://python123.io/ws/demo.html"文档为例

     1 import requests
     2 from bs4 import BeautifulSoup
     3 r = requests.get("http://python123.io/ws/demo.html")
     4 demo = r.text
     5 soup = BeautifulSoup(demo,"html.parser")
     6 print(soup.prettify())
     7 <html>
     8  <head>
     9   <title>
    10    This is a python demo page
    11   </title>
    12  </head>
    13  <body>
    14   <p class="title">
    15    <b>
    16     The demo python introduces several python courses.
    17    </b>
    18   </p>
    19   <p class="course">
    20    Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:
    21    <a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">
    22     Basic Python
    23    </a>
    24    and
    25    <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">
    26     Advanced Python
    27    </a>
    28    .
    29   </p>
    30  </body>
    31 </html>

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

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

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

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

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

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

    name参数:

    (1)检索a标签

    1 soup.find_all("a")
    2 [<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>]

    (2)检索a、b标签

    1 soup.find_all(["a","b"])
    2 [<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>]

    (3)如参数为True,则检索所有标签名

     1 for tag in soup.find_all(True):
     2     print(tag.name)    
     3 html
     4 head
     5 title
     6 body
     7 p
     8 b
     9 p
    10 a
    11 a

    (4)检索标签名以'b'开头的所有标签

    1 import re #引入正则表达式库
    2 for tag in soup.find_all(re.compile('b')):
    3     print(tag.name) 
    4 body
    5 b

    attrs参数:

    (1)带有"course"属性值的p标签

    1 soup.find_all('p',"course")
    2 [<p class="course">Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:
    3 <a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a> and <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>.</p>]

    (2)id属性值为"link1"的标签

    1 soup.find_all(id = "link1")
    2 [<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>]

    (3)id属性值为"link"的标签

    1 soup.find_all(id = "link")
    2 []

    (4)id属性值中包含"link"的标签

    1 import re #引入正则表达式库
    2 soup.find_all(id = re.compile("link"))
    3 [<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>]

    recursive参数:

    1 soup.find_all("a") #recursive默认为True
    2 [<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>]
    3 soup.find_all("a",recursive = False) #令recursive为True
    4 [] #soup的儿子标签中没有a标签

    string参数:

    (1)检索字符串区域为“Basic Python”的字符串

    1 soup.find_all(string = "Basic Python")
    2 ['Basic Python']

    (2)检索字符串区域出现"python"的字符串

    1 soup.find_all(string = re.compile("python"))
    2 ['This is a python demo page', 'The demo python introduces several python courses.']

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

    soup(…)等价于soup.find_all(…)

    <>.find_all()扩展方法

    方法 说明
    <>.find() 搜索且只返回一个结果,字符串类型,同.find_all()参数
    <>.find_parents() 在先辈节点中搜索,返回列表类型,同.find_all()参数
    <>.find_parent() 在先辈节点中返回一个结果,字符串类型,同.find ()参数
    <>.find_next_siblings() 在后续平行节点中搜索,返回列表类型,同.find_all()参数
    <>.find_next_sibling() 在后续平行节点中返回一个结果,字符串类型,同.find()参数
    <>.find_previous_siblings() 在前序平行节点中搜索,返回列表类型,同.find_all()参数
    <>.find_previous_sibling() 在前序平行节点中返回一个结果,字符串类型,同.find ()参数

    资料来源:《Python网络爬虫与信息提取》——嵩天,北京理工大学,MOOC

  • 相关阅读:
    C#资源释放方法实例分析
    c#中在一个窗体中触发另一个窗体的事件
    C#定时器的用法
    C# 类的析构函数和释放函数
    C# 定时执行,文件占用
    C#多线程与异步
    Newtonsoft中JArray 转成list<object>
    C#中Dictionary的用法
    C# 解析Json文件(使用NewtonJson库)
    mysql无法远程连接10038错误的坑(阿里云ecs)
  • 原文地址:https://www.cnblogs.com/huskysir/p/12454619.html
Copyright © 2011-2022 走看看