Python-爬虫-信息标记

HTLM是WWW的信息组织方式
H->hyper,
T->text,
M->markup,
L->language,
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 href="http://www.icourse163.org/course/BIT-268001" class="py1" id="link1">Basic Python</a> and <a href="http://www.icourse163.org/course/BIT-1001870001" class="py2" id="link2">Advanced Python</a>.</p>
</body></html>

信息标记的一般种类,
XML 扩展标记语言,与html形式相近,通过标签形式来构建信息
JSON(JavaScript Object Notation) 有类型的键值对key:value构建的信息表达方式

"name":"北京理工大学"
"name":["北京理工大学","延安自然科学院"]
"name":{
	"newName":"北京理工大学"
	"oldName":"延安自然科学院"
	}//键值对嵌套使用

YAML(YAML Ain’t Markup Language) 使用无类型的键值对构建信息
使用缩进来表达所属关系
使用’-'表达并列关系

name:
	name:北京理工大学
	oldName:延安自然科学院
#使用缩进来表达所属关系

name:
	-北京理工大学
	-延安自然科学院
#使用'-'表达并列关系,一个名字对应两个值

text:|	#学校介绍
北京理工大学(Beijing Institute of Technology)是中国共产党创办的第一所理工科大学,隶属于中华人民共和国工业和信息化部,是全国重点大学,首批进入国家“211工程”、“985工程”,首批进入世界一流大学建设高校A类行列.

三种形式比较:
XML 是最早的通用信息标记语言,可扩展性好,但繁琐
JSON 信息有类型,适合程序处理(js),较XML简洁.
YAML 信息无类型,文本信息比例最高,可读性好.

XML Internet上的信息交互与传递.html是XML这一类别的.
JSON 移动应用云端和节点的信息通信,无解释.JSON用在程序对接口处理的地方,JSON数据在作为程序代码的一部分,并被程序直接运行时,JSON格式中对信息类型的定义才能最大的发挥作用.缺点:无法体现注释.
YAML 各类系统的配置文件中,有注释易读.应用较广.

信息提取的一般方法
方法一:完整解析信息的标记形式,再提取关键信息.
XML JSON YAML
需要标记解释器 例如:bs4库的标签树遍历
优点:信息解析准确
缺点:提取过程繁琐,速度慢.

方法二:无视标记形式,直接搜索关键信息.
搜索
对信息的文本查找函数即可.
优点:提取过程简洁,速度较快.
缺点:提取结果的准确性与信息内容相关.

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

实例:
提取HTML中所有URL链接
思路:
1)搜索到所有标签
2)解析标签格式,提取href后的链接内容

import requests
from bs4 import BeautifulSoup

url = "http://python123.io/ws/demo.html"
r = requests.get(url)
demo = r.text
soup = BeautifulSoup(demo, "html.parser") # 以html格式进行解析
for link in soup.find_all('a'):
    print(link.get('href'))

beautiful soup中提供方法find_all()可以在soup中查询信息
<>.find_all(name,attrs,recursive,string,**kwargs)
返回一个列表类型,储存查找的结果.

#name:对标签名称的检索字符串.
soup.find_all('a') 				#查找<a>..</a>标签

soup.find_all(['a', 'b'])	 	#查找a标签和b标签

for tag in soup.find_all(True):	#查找所有标签
    print(tag.name)				#打印标签的名字

for tag in soup.find_all(re.compile('b')):#使用正则表达式查找以b开头的标签
    print(tag.name)
#attrs:对标签属性值的检索字符串,可标注属性检索.
soup.find_all('p', 'course')	#查找带有course属性值的p标签
soup.find_all(id='link1') 		#直接对属性做相关的约定,此为精确查询,不多也不少,若要同时查找属性为link的标签则需要正则表达式的支持
soup.find_all(id=re.compile('link'))#查找属性以link开头的标签
#recursive:是否对子孙全部搜索,默认True
soup.find_all('a', recursive=False) #只在soup的儿子节点层面查找a标签
#string:对标签中字符串区域(<>...</>)进行字符串检索.也就是文本信息
soup.find_all(string='Basic Python') #同样是精确查找
soup.find_all(string=re.compile('Python'))#查找所有带Python的字符串

由于find_all()函数非常常用,为此beautiful soup库提供了简写方式
< tag>(…) 等价于 < tag>.find_all(…)
soup(…) 等价于 soup.find_all(…)

soup.find提供了7个扩展方法.相较于find_all方式只是检索区域不同.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值