Python-信息组织和提取

信息的标记

例如:

狗东西 = 一个信息

男的 活的 再用功学习的 = 一组信息、

sex=男的 学习态度 = 用功的 =信息的标记

信息标记的特点

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

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

标记后的信息可用于通信、存储或展示
标记后的信息更利于程序理解和运用

HTML的信息标记

文本

声音

图像

视频

他们一起构成了超文本

HTML是WWW(World Wide Web)的信息组织方式

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

例如:

<html>
 <head>
  <title>
   This is a python demo page
  </title>
 </head>
 <body>
  <p class="title">
   <b>
    The demo python introduces several python courses.
   </b>
  </p>
  <p class="course">
   Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:
   <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>
 </body>
</html>

信息标记的三种种类

① XML

② JSON

③ YAML

① XML eXtensible Markup Language

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

img 是名称(Name) src 和size 都是属性 Attribute jpg 是标签

XML 是一个HTML一种通用的信息表达形式

② JSON JavsScript Object Notation

有类型的键值对key:value

例如

“name” : "狗蛋"

或者

"age": 23

只有字符串的时候,后面的值要加""

如果后面的值有多个的情况

例如

"name" : ["狗蛋","黄鹏宇"]

而且键值对是可以嵌套使用的

例如

"attitude" : {

​ "oldattitude" : "没有目标"

​ "newattitude" : "拼命一把"

}

总结 :JSON的键值对是由类型的,可以嵌套使用

③ YAML YAML Ain’t Markup Language

键值对是无类型的

无类型键值对key:value

name : 北京理工大学

YAML 用 -表示并列关系

Name :

​ -狗蛋

​ -妈妈的宝贝

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

text: |

天才杀手不良少女和冰山校草黑客富二代
两个毫无关系的同学因为一场阴谋而变成了伙伴!
六年前变成孤儿的少女为何变成现在的杀手?
五年前的少年与现在的校草又是否是一个人?
一个巨大的阴谋与一个奇怪的组织慢慢浮出水面
背后的密码被渐渐揭开
一切的一切
都将为你展开……

三种信息标记的比较

XML 实例

<person>
	<firstName>Tian</firstName>
	<lastName>Song</lastName>
	<address>
		<streetAddr>中关村南大街5号</streetAddr>
		<city>北京市</city>
		<zipcode>100081</zipcode>
	</address>
	<prof>Computer System</prof><prof>Security</prof>
</person>

JSON实例

{
“firstName” : “Tian” ,
“lastName”  : “Song” , “address”   : {
			“streetAddr” : “中关村南大街5号” , 
			“city”       : “北京市” , 
			“zipcode”    : “100081”
			} ,
“prof”      : [ “Computer System” , “Security” ]
}

YAML实例

firstName : Tian
lastName  : Song address   :
		streetAddr : 中关村南大街5号
	city       : 北京市
zipcode    : 100081
prof      :
‐Computer System
‐Security

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

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

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

信息提取的一般方法

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

优点 : 信息解析准确

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

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

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

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

将两者一起使用

一个例子:

import requests
from  bs4 import  BeautifulSoup

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'))

结果如下:

http://www.icourse163.org/course/BIT-268001
http://www.icourse163.org/course/BIT-1001870001

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

find_all(name, attrs, recursive, string, **kwargs)
∙ name : 对
标签名称的检索字符串
返回一个列表类型,存储查找的结果
name : 对标签名称的检索字符串
attrs: 对标签属性值的检索字符串,可标注属性检索
recursive: 是否对子孙全部检索,默认True
string: <>…</>中字符串区域的检索字符串

代码如下:

import requests
from  bs4 import  BeautifulSoup

r = requests.get('http://python123.io/ws/demo.html')
demo = r.text
soup = BeautifulSoup(demo,'html.parser')

soup.find_all('a')      #输出所有的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>]
'''
#输出所有的标签
for tag in soup.find_all(True):
    tag.name
'''
html
head
title
body
p
b
p
a
a
'''

soup.find_all('p','course')

'''
[<p class="course">Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:
<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>]
'''
soup.find_all(id='link1')
soup.find_all(id='link')
'''
[<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>]
[]
'''
soup.find_all('a')
soup.find_all('a',recursive=False)
'''
[<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(..)

扩展方法

方法 说明
<>.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()参数
posted @ 2020-04-27 10:32  黄鹏宇  阅读(267)  评论(0)    收藏  举报