python中文文本信息提取_#Python学习笔记# 爬虫入门到放弃(四)

9b71185931d4ee5105df53fbe78cb40e.png

01  信息标记 能够成功抓取到HTML文档已经算是一个爬虫了,但是我们的最终目的并不是获取人类难以阅读的HTML文档,而是从文档中快速提取到关键信息。 在提取关键信息之前,我们先来简单说说信息的标记。 其实“标记”这个概念日常生活中用的很多,比如在表格首行的表头是一种信息标记,比如给微信好友添加标签是一种信息标记,比如给垃圾进行分类的垃圾桶也是一种标记,...。如果不做这些标记,我们很难快速找到关键信息,由此可见,做标记的目的是为了方便阅读、查找、分类、存储。 网络上的信息形式包括文字、声音、图像、视频,链接,它们常常组合出现,所以为了方便通信、存储和展示,超文本标记语言应运而生。 HTML通过<>…>标签形式组织不同类型的信息,它使用不同的标签来标记信息。通常,一个HTML文档以开始,以结束,里面包含head标签和body标签,head和body标签内再包含其他特定类型的标签,这样一直包含直到最终包含不可再标记的信息元素。

9a3e639e159eef7c8c14e27d59501dc0.png

... 1c651349205b635f3cf9879d1ce08c8e.png 这种嵌套标记方式对于人类来说阅读性很差,但是对于程序来说就很容易了。

02 信息提取

明白了HTML文档的标记思路,想要在这种文档中提取关键信息也就有3种策略了。
  • 第 1 种,暴力搜索。说到底毕竟是个文档,只不过多了标签信息,所以无视标签强行搜索并不难,但是搜索结果可能需要再处理。

  • 第 2 种,解析文档得到树状结构再进行关键信息提取。这种方法要搞明白文档结构,相当于先做复杂工作,最后的输出是简洁的。

  • 第 3 种,二者结合使用,可以先解析得到关键信息的所在区域,再快速的暴力搜索。

实践中通常从问题出发,方便哪个就用哪个,下面简单介绍bs4库的信息提取工具以及正则表达式。

    bs4库的HTML解析器

soup=BeautifulSoup('data','html.parser')

它构造一个soup对象,将HTML文档以“标签树”的形式组织起来,在这个具有层级关系的“标签树”中,基本元素就是标签,用它可以解析到任意标签的名称、属性、内容字符串等。

31c57b633399e3e50574f81655d60daf.png

    bs4库的查找方法

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

  • 返回值:列表类型,存储查找的结果

  • name:标签名称的检索字符串、正则表达式、列表、方法或True

  • attrs:标签属性值的检索字符串、正则表达式、列表或True

    (常用attrs={‘属性1’: ‘值1’, ‘属性2’: ‘值2’,...})

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

  • string:标签中字符串区域的检索字符串

findall使用起来非常灵活,具体的使用方法和注意事项还需要查阅说明文档,网络上也有很多用法总结类的文章。

    正则表达式和re库

正则表达式是一种用来简洁描述字符串特征的工具。 这个其实有点信息压缩的感觉,比如字符串‘899999999’可以描述成‘8,9个9’,是不是简洁许多呢!但是它远比这个例子复杂,因为它定义了不常用的字符和操作规则,但是如果使用恰当,确实有一行胜千言的效果。
正则表达式常用操作符
操作符说明示例
.表示任何单个字符
\d表示一个数字等价于[0-9]
\w表示一个单词等价于[A-Za-z0-9]
[ ]字符集,单个字符的取值范围[abc]表示a、b、c
[a-z]表示a到z的单字符
[^ ]非字符集,单个字符的排除范围[^abc]表示非a或b或c的单字符
*扩展0次或无限次abc*表示ab、abc、abcc等
+扩展1次或无限次abc+表示abc、abcc、abccc等
?扩展0次或1次abc+表示ab、abc等
{m}扩展m次ab{2}c表示abbc
{m,n}扩展m至n次(含n)ab{1,2}c表示abc、abbc
^匹配字符串开头^abc表示abc开头的字符串
$匹配字符串结尾abc$表示abc结尾的字符串
|左右表达式任意一个(abc | def)表示abc、def
( )分组标记,内部只能使用 |‍‍(abc)表示abc
经典实例说明
^[A‐Za‐z]+$由26个字母组成的字符串
^[A‐Za‐z0‐9]+$由26个字母和数字组成的字符串
^‐?\d+$整数形式的字符串
^[0‐9]*[1‐9][0‐9]*$正整数形式的字符串
[\u4e00‐\u9fa5]匹配中文字符
[1‐9]\d{5}境内邮政编码,6位
\d{3}‐\d{8}|\d{4}‐\d{7}电话号码,010‐68913536
python的 re库可以用于字符串的匹配,它可以用  r‘text’ 来表示正则表达式。re库的功能函数可以在一段字符串中匹配正则表达式所表示的子串,并且拥有函数式用法如 re.findall()和对象式用法如 re.compile()两种使用方式。      python自带的字符串处理方法bs4的查找需要对文档的标签组织结构很清楚,re的正则表达式匹配有时候写起来也挺难,但是别忘了python自带的字符串处理功能,查找、切片、分割、替换、删除等等一系列的操作也非常强大。

b0118ee2f969755d624c045ccb7ff1db.png

以上关于信息提取工具的用法细节在这里就不展开了,很多时候,这些工具都是综合使用,你中有我,我中有你,并且在解决具体问题的时候还是要就某个工具去深入地查一查,这样才能用出来,记下来。 03  python相关的操作

前面我们已经将网页的HTML文档抓取下来,接下来我们增加信息提取的代码来实现上面说的一些功能。

上一期获取了的无序列表ul标签,它里面包含一些列表li标签,列表标签元素的id属性和内容结构是类似的,所以基本思路是可以根据这个id过滤出这个标签列表,进一步遍历提取一个列表元素内的文本,再用正则表达式配合字符串处理进行提取即可。

ul标签内的li标签

639c3737efc78ca7f6682973f2cdb16f.png

上期ul标签的输出

315d766fb0d9af24b02ee313fdd7fc92.png

每个列表元素提取出来的文本

90c3b8469907489a309afc378a702096.png

加入信息提取代码后的最终输出

bb2503c3a4ef0725a18482f0defc7ae7.png 上述输出的源代码
from bs4 import BeautifulSoup #bs4约定的引用方式import requests #提交网络请求所需要的库import reimport time #用来处理时间戳#要访问的资源地址,从浏览器中复制过来url="https://weixin.sogou.com/weixin?type=1&s_from=input&query=%E6%94%BE%E7%96%97&ie=utf8&_sug_=y&_sug_type_=&w=01019900&sut=5917&sst0=1600786021035&lkt=0%2C0%2C0"#在请求头中构造和浏览器一样的用户代理,同样从浏览器中复制过来headers={    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'    }#发起get请求时加入上面的headers,忽悠反爬虫这是个来自浏览器的请求r=requests.get(url,headers=headers)#这里得到HTML文档内容demo=r.text#bs4的html解析器Bigsoup=BeautifulSoup(demo,'html.parser')#在Bigsoup中提取所关注的标签,缩小查找范围taglist=Bigsoup.findAll(id=re.compile(r'sogou_vr_11002301_box_\d'))#遍历上面的标签列表,每个标签处理方法是一样的for tag in taglist:    #将每个小标签解析成smallsoup,再提取该标签内的所有文本    smallsoup=BeautifulSoup(str(tag),'html.parser')    txt=smallsoup.text    #使用各种信息提取手段提取关键信息    name=txt[7:].split('\n',1)[0]#字符串切片和分割    id=re.findall(r'微信号:[0-9a-zA-Z_]+',txt.replace('\n',''))    title=re.findall(r'最近文章:[\u4e00-\u9fa5]+',txt.replace('\n',''))    timestamps=re.findall(r"\d{9}",txt)#这里是获取的时间戳字符串    if len(timestamp)==1:        #将时间戳字符串转换成格式化的时间        Time=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(int(timestamps[0])))    #接下来就可以输出啦    print('{}.'.format(n),name,id[0])    if len(title)==1:        print(title[0])        print('发布时间:',Time)

这样,一个网页上的关键信息就被爬虫抓取下来了,python代码是不是相当简洁呢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值