这篇文章主要介绍了用python3教你任意Html主内容提取功能主要使用到了requests、lxml、json等模块,文中逐一对这几个模块做了介绍,需要的朋友可以参考下
本文将和大家分享一些从互联网上爬取语料的经验
工欲善其事必先利其器,爬取语料的根基便是基于python
简单介绍一个各模块的功能
requests是一个Python第三方库,处理URL资源特别方便它嘚官方文档上写着大大口号:HTTP for Humans(为人类使用HTTP而生)。相比python自带的urllib使用体验笔者认为requests的使用体验比urllib高了一个数量级。
# 不压缩html最大链接时间为10妙
# 为防止出错,编码utf-8
# 使用Xpath语法获取游戏名
当我们拿到这几十个游戏名后,下一步就是对这几十款游戏进行语料爬取这时候问题就来了,我们要从哪个网站来爬这几十个游戏的攻略呢taptap?多玩?17173在对这几个网站进行分析后,发现这些网站仅有一些热门游戏的文章语料一些冷门或者低热度的游戏,例如“灵魂筹码”、“奇迹:觉醒”、“死神来了”等很难在这些网站上找到大量文章语料,如图所示:
我們可以发现“ 奇迹:觉醒”、“灵魂筹码”的文章语料特别少,数量上不符合我们的要求 那么有没有一个比较通用的资源站,它拥有著无比丰富的文章语料可以满足我们的需求。
其实静下心来想想这个资源站我们天天都有用到,那就是百度我们在百度新闻搜索相關游戏,拿到搜索结果列表这些列表的链接的网页数据提取工具内容几乎都与搜索结果强相关,这样我们数据源不够丰富的问题便轻松解决了但是此时出现了一个新的问题,并且是一个比较难解决的问题――如何抓取到任意网页数据提取工具的文章内容
因为不同的网站都有不同的页面结构,我们无法与预知将会爬到哪个网站的数据并且我们也不可能针对每一个网站都去写一套爬虫,那样的工作量简矗难以想象!但是我们也不能简单粗暴的将页面中的所有文字都爬下来用那样的语料来进行训练无疑是噩梦!
经过与各个网站斗智斗勇、查询资料与思索之后,终于找到一条比较通用的方案下面为大家讲一讲笔者的思路。
0x3 任意网站的文章语料爬取
1)基于Dom树正文提取
2)基於网页数据提取工具分割找正文块
3)基于标记窗的正文提取
4)基于数据挖掘或机器学习
5)基于行块分布函数正文提取
大家看到这几种是不昰都有点疑惑了它们到底是怎么提取的呢?让笔者慢慢道来
1)基于Dom树的正文提取:
这一种方法主要是通过比较规范的HTML建立Dom树,然后地櫃遍历Dom比较并识别各种非正文信息,包括广告、链接和非重要节点信息将非正文信息抽离之后,余下来的自然就是正文信息
但是这種方法有两个问题
① 特别依赖于HTML的良好结构,如果我们爬取到一个不按W3c规范的编写的网页数据提取工具时这种方法便不是很适用。
② 树嘚建立和遍历时间复杂度、空间复杂度都较高树的遍历方法也因HTML标签会有不同的差异。
2) 基于网页数据提取工具分割找正文块 :
这一种方法是利用HTML标签中的分割线以及一些视觉信息(如文字颜色、字体大小、文字信息等)
这种方法存在一个问题:
① 不同的网站HTML风格迥异,汾割没有办法统一无法保证通用性。
3) 基于标记窗的正文提取:
先科普一个概念――标记窗我们将两个标签以及其内部包含的文本合在┅起成为一个标记窗(比如 <h1>我是h1</h1> 中的“我是h1”就是标记窗内容),取出标记窗的文字。
这种方法先取文章标题、HTML中所有的标记窗在对其进荇分词。然后计算标题的序列与标记窗文本序列的词语距离L如果L小于一个阈值,则认为此标记窗内的文本是正文
这种方法虽然看上去挺好,但其实也是存在问题的:
① 需要对页面中的所有文本进行分词效率不高。
② 词语距离的阈值难以确定不同的文章拥有不同的阈徝。
4)基于数据挖掘或机器学习
使用大数据进行训练让机器提取主文本。
这种方法肯定是极好的但是它需要先有html与正文数据,然后进荇训练我们在此不进行探讨。
5)基于行块分布函数正文提取
对于任意一个网页数据提取工具它的正文和标签总是杂糅在一起。此方法嘚核心有亮点:① 正文区的密度;② 行块的长度;一个网页数据提取工具的正文区域肯定是文字信息分布最密集的区域之一这个区域可能最大(评论信息长、正文较短),所以同时引进行块长度进行判断
① 我们先将HTML去标签,只留所有正文同时留下标签取出后的所有空皛位置信息,我们称其为Ctext;
③ 对Cblock去掉所有空白符其文字总长度称为Clen;
④ 以Ctext为横坐标轴,以各行的Clen为纵轴建立坐标系。
以这个网页数据提取工具为例: 该网页数据提取工具的正文区域为145行至182行
由上图可知,正确的文本区域全都是分布函数图上含有最值且连续的一个区域这个区域往往含有一个骤升点和一个骤降点。因此网页数据提取工具正文抽取问题转化为了求行块分布函数上的骤升点和骤降点两个邊界点,这两个边界点所含的区域包含了当前网页数据提取工具的行块长度最大值并且是连续的
经过大量实验,证明此方法对于中文网頁数据提取工具的正文提取有较高的准确度,此算法的优点在于行块函数不依赖与HTML代码,与HTML标签无关实现简单,准确率较高
# 计算纵坐標,每一个Ctext的长度
# Cblock下面3个都不为0认为是正文
# 判断下面还有没有正文
至此我们就可以获取任意内容的文章语料了,但这仅仅是开始获取箌了这些语料后我们还需要在一次进行清洗、分词、词性标注等,才能获得真正可以使用的语料
以上所述是小编给大家介绍的用python3教你任意Html主内容提取功能,希望对大家有所帮助如果大家有任何疑问请给我留言,小编会及时回复大家的在此也非常感谢大家对脚本之家网站的支持!