乙肝康复网,内容丰富有趣,生活中的好帮手!
乙肝康复网 > 【网络爬虫与信息提取】信息的组织与提取

【网络爬虫与信息提取】信息的组织与提取

时间:2022-09-12 11:29:40

相关推荐

一、信息组织的三种形式

信息一般为了方便管理、存储、理解和运用,都采用了一定的存取方式,就好比HTML文件里面的信息都是采用了标签的形式进行存储的。

一般来说,信息标记主要有三种方式:

①XML

XML文件我们已经不是第一次见了,HTML本身也属于一种XML文件,这种方式以标签的形式组织管理信息,通过标签之间的嵌套关系来组织信息,在标签内部可以使用属性来对标签进行进一步的修改,除此之外还可以使用<!-- -->的形式来进行注释。

②JSON

在做毕设的过程中也使用过这种组织形式,微信小程序的数据库使用的也是这种形式。JSON属于有类型的键值对,是key和value组成的对,不管是键还是值,都需要使用双引号来表示类型是字符串,当然也存在一个键对应多个值的情况,这种情况下值使用列表来表示,列表内部依然需要使用双引号来表示字符串类型。

除此之外,JSON也支持嵌套的信息,有点像C里面的结构体,通过大括号与逗号的嵌套来表示复杂的关系。

这张图展示了JSON的三种形式,第一种是最普通的形式,有一个键叫做key,然后key的值为value。第二种key的值变成了value1和value2。第三种就是一种复合结构,这个JSON键值对的意思是key是一个键,这个键的值是由其它键值对组成的,对于这个key,它的值是由一个值为subvalue的叫做subkey的键值对构成的。

③YAML

YAML和JSON很像,属于一种无类型键值对,和JSON最大的区别就是不需要使用双引号表示字符串。另外YAML使用缩进来表示所属关系,这里和Python的缩进同一个道理。使用-表示并列关系,使用|表示整块数据,使用#表示注释。

上图展示的就是三个YAML键值对,第一个键的值为value,而第二个键使用了一个注释,真正的value是下面并列的value1和value2,第三个键是由键值对构成的,内部包含了一个值为subvalue名字为subkey的键值对。

三种信息组织形式各有利弊,首先XML是最常见的,使用成对的标签来组织信息,好处是比较清晰易懂,但是每个标签都需要规定名称,有时候会导致标签占用的存储量比信息占用的存储量还要大很多。使用JSON则大大减少了无用信息,因为将原本的标签换成了键值对,至少减少了一半的无关内容,另外这种键值对的形式很适合与程序的处理。YAML由于是无类型的,所以文本比例信息最高。

一般XML用于互联网上的信息交互与传递,JSON用于移动应用云端和节点的信息通信,但是没有注释,YAML主要用于各类系统的配置文件,并且有注释可读性变高。

二、信息提取的一般方法

所谓信息提取,就是从标记后的信息中提取所关注的内容。一般的信息提取方法有三种:

①完整解析

先将信息的标记形式完整解析,再提取关键信息。这种方式一般要使用标记解析器,信息的解析比较准确,但是提取的过程较慢。

②直接搜索

无视标记,直接搜索关键的信息,这种方式提取过程简单,速度也很快,但是准确性有时候不高。

③融合方法

融合上面两种方法,需要使用标记解析器和文本查找函数。

结合前面使用过的bs4库,一般常用的查找函数是find_all()方法,这个方法返回值是一个列表,列表里面存储了查找的结果。

这段代码先将获取的网页信息利用BeautifulSoup方法转换为soup,之后就可以调用find_all方法,查找其中的元素,这里是查找了所有a标签,直接用标签名字进行查找,如果需要一次查找多个也可以将名字存在一个列表中,然后将列表作为参数进行查找。

find_all方法一共有五个参数:

①name

用于对某个标签的名称进行查询,返回的是所有目标标签的字符串组成的列表。

②attrs

对标签属性值进行检索,这里要注意,attrs是第二个参数,所以第一个参数需要先写好才能写第二个,第一个如果能够指明标签名,则查找的结果是符合attrs的某类标签组成的列表,也可以指定一个True,这样查找的就是所有attrs为目标值的标签。

图中所示的第一个查找,查找的是所有属性值含有course的标签,如果不写第一个参数也可以使用下面的方式:

③recursive

是否对子孙全部搜索,默认为True,简单来说就是搜索的范围,为False时只搜索儿子节点。

④string

在字符串区域中进行检索,这里的检索一定是完全按照格式进行的,连空格也要完全一样。

⑤扩展方法

这部分扩展方法和前面对标签树的遍历是一个思路,放一张截图:

三、信息提取实例:爬取大学排名信息

这个实例是网课上的实例,主要功能是访问一个大学排名的网站,将里面的排名信息提取出来,用列表的形式格式化输出。

从功能来看,程序主要是三个部分来实现的,首先要从网络上获取大学排名网页的信息,之后对网页信息进行筛选,最后格式化输出。所以采用三个函数去实现。

import requestsimport bs4from bs4 import BeautifulSoupdef getHtmlText(url):try:r = requests.get(url)r.raise_for_status()r.encoding = r.apparent_encodingreturn r.textexcept: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}\t{:^6}\t{:^10}".format("排名", "学校名称", "总分"))for i in range(num):u = ulist[i]print("{:^10}\t{:^6}\t{:^10}".format(u[0], u[1], u[2]))def main():uinfo = []url = '/zuihaodaxuepaiming.html'html = getHtmlText(url)fillUnivList(uinfo, html)printUnivList(uinfo, 20)main()

因为这个获取排名的网站已经没有了,现在是404,所以程序处在一个不能运行的状态,主要是记录一下代码中的比较重点的部分。在fillUnivList函数中,使用了一个isinstance()的函数,这个函数用于检测一个标签是不是bs4库中有的标签,采用这个函数目的是将混入其中的字符串去掉,只对正确的标签进行检测,这个函数在bs4库中,需要单独引入这个库。

如果觉得《【网络爬虫与信息提取】信息的组织与提取》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。