深度剖析使用python抓取网页正文的源码


Posted in Python onJune 11, 2014

本方法是基于文本密度的方法,最初的想法来源于哈工大的《基于行块分布函数的通用网页正文抽取算法》,本文基于此进行一些小修改。

约定:
       本文基于网页的不同行来进行统计,因此,假设网页内容是没有经过压缩的,就是网页有正常的换行的。

       有些新闻网页,可能新闻的文本内容比较短,但其中嵌入一个视频文件,因此,我会给予视频较高的权重;这同样适用于图片,这里有一个不足,应该是要根据图片显示的大小来决定权重的,但本文的方法未能实现这一点。

       由于广告,导航这些非正文内容通常以超链接的方式出现,因此文本将给予超链接的文本权重为零。

       这里假设正文的内容是连续的,中间不包含非正文的内容,因此实际上,提取正文内容,就是找出正文内容的开始和结束的位置。     

步骤:

       首先清除网页中CSS,Javascript,注释,Meta,Ins这些标签里面的内容,清除空白行。

       计算每一个行的经过处理的数值(1)

       计算上面得出的每行文本数的最大正子串的开始结束位置

其中第二步需要说明一下:

       对于每一行,我们需要计算一个数值,这个数值的计算如下:

              一个图片标签img,相当于出现长度为50字符的文本 (给予的权重),x1,

              一个视频标签embed,相当于出现长度为1000字符的文本, x2

              一行内所有链接的标签 a 的文本长度 x3 ,

              其他标签的文本长度 x4

              每行的数值 = 50 * x1其出现次数 + 1000 * x2其出现次数 + x4 ? 8

        //说明, -8 因为我们要计算一个最大正子串,因此要减去一个正数,至于这个数应该多大,我想还是按经验来吧。

完整代码

#coding:utf-8
import re
def remove_js_css (content):
    """ remove the the javascript and the stylesheet and the comment content (<script>....</script> and <style>....</style> <!-- xxx -->) """
    r = re.compile(r'''<script.*?</script>''',re.I|re.M|re.S)
    s = r.sub ('',content)
    r = re.compile(r'''<style.*?</style>''',re.I|re.M|re.S)
    s = r.sub ('', s)
    r = re.compile(r'''<!--.*?-->''', re.I|re.M|re.S)
    s = r.sub('',s)
    r = re.compile(r'''<meta.*?>''', re.I|re.M|re.S)
    s = r.sub('',s)
    r = re.compile(r'''<ins.*?</ins>''', re.I|re.M|re.S)
    s = r.sub('',s)
    return s
def remove_empty_line (content):
    """remove multi space """
    r = re.compile(r'''^\s+$''', re.M|re.S)
    s = r.sub ('', content)
    r = re.compile(r'''\n+''',re.M|re.S)
    s = r.sub('\n',s)
    return s
def remove_any_tag (s):
    s = re.sub(r'''<[^>]+>''','',s)
    return s.strip()
def remove_any_tag_but_a (s):
    text = re.findall (r'''<a[^r][^>]*>(.*?)</a>''',s,re.I|re.S|re.S)
    text_b = remove_any_tag (s)
    return len(''.join(text)),len(text_b)
def remove_image (s,n=50):
    image = 'a' * n
    r = re.compile (r'''<img.*?>''',re.I|re.M|re.S)
    s = r.sub(image,s)
    return s
def remove_video (s,n=1000):
    video = 'a' * n
    r = re.compile (r'''<embed.*?>''',re.I|re.M|re.S)
    s = r.sub(video,s)
    return s
def sum_max (values):
    cur_max = values[0]
    glo_max = -999999
    left,right = 0,0
    for index,value in enumerate (values):
        cur_max += value
        if (cur_max > glo_max) :
            glo_max = cur_max
            right = index
        elif (cur_max < 0):
            cur_max = 0
    for i in range(right, -1, -1):
        glo_max -= values[i]
        if abs(glo_max < 0.00001):
            left = i
            break
    return left,right+1
def method_1 (content, k=1):
    if not content:
        return None,None,None,None
    tmp = content.split('\n')
    group_value = []
    for i in range(0,len(tmp),k):
        group = '\n'.join(tmp[i:i+k])
        group = remove_image (group)
        group = remove_video (group)
        text_a,text_b= remove_any_tag_but_a (group)
        temp = (text_b - text_a) - 8 
        group_value.append (temp)
    left,right = sum_max (group_value)
    return left,right, len('\n'.join(tmp[:left])), len ('\n'.join(tmp[:right]))
def extract (content):
    content = remove_empty_line(remove_js_css(content))
    left,right,x,y = method_1 (content)
    return '\n'.join(content.split('\n')[left:right])

代码 从最后一个函数开始调用。

Python 相关文章推荐
Python Web服务器Tornado使用小结
May 06 Python
深入探究Python中变量的拷贝和作用域问题
May 05 Python
基python实现多线程网页爬虫
Sep 06 Python
对python字典元素的添加与修改方法详解
Jul 06 Python
Selenium定位元素操作示例
Aug 10 Python
使用Python监视指定目录下文件变更的方法
Oct 15 Python
对pandas里的loc并列条件索引的实例讲解
Nov 15 Python
Python中的asyncio代码详解
Jun 10 Python
Python3搭建http服务器的实现代码
Feb 11 Python
通过自学python能找到工作吗
Jun 21 Python
基于opencv的selenium滑动验证码的实现
Jul 24 Python
pycharm配置安装autopep8自动规范代码的实现
Mar 02 Python
python k-近邻算法实例分享
Jun 11 #Python
浅析python 内置字符串处理函数的使用方法
Jun 11 #Python
python使用正则表达式检测密码强度源码分享
Jun 11 #Python
Python查看多台服务器进程的脚本分享
Jun 11 #Python
Python SQLite3数据库操作类分享
Jun 10 #Python
Python不规范的日期字符串处理类
Jun 10 #Python
Python ORM框架SQLAlchemy学习笔记之数据查询实例
Jun 10 #Python
You might like
php学习之运算符相关概念
2011/06/09 PHP
php自定义函数实现汉字转换utf8编码的方法
2016/09/29 PHP
jquery 常用操作方法
2010/01/28 Javascript
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
2010/02/07 Javascript
node.js中使用q.js实现api的promise化
2014/09/17 Javascript
javascript实现点击按钮让DIV层弹性移动的方法
2015/02/24 Javascript
一不小心就做错的JS闭包面试题
2015/11/25 Javascript
js时间戳转为日期格式的方法
2015/12/28 Javascript
最简单的tab切换实例代码
2016/05/13 Javascript
JavaScript中正则表达式判断匹配规则及常用方法
2017/08/03 Javascript
angularJs中跳转到指定的锚点实例($anchorScroll)
2018/08/31 Javascript
[04:09]2014DOTA2国际邀请赛Ti西雅图 历届冠军相继出局 BBC综述今日比赛
2014/07/20 DOTA
[00:44]2016完美“圣”典 风云人物:Mikasa宣传片
2016/12/07 DOTA
python基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
2013/12/08 Python
Python中logging模块的用法实例
2014/09/29 Python
python查询mysql中文乱码问题
2014/11/09 Python
Python实现备份MySQL数据库的方法示例
2018/01/11 Python
python+selenium打印当前页面的titl和url方法
2018/06/22 Python
python将一组数分成每3个一组的实例
2018/11/14 Python
对python以16进制打印字节数组的方法详解
2019/01/24 Python
face++与python实现人脸识别签到(考勤)功能
2019/08/28 Python
Python类反射机制使用实例解析
2019/12/30 Python
Django-rest-framework中过滤器的定制实例
2020/04/01 Python
浅谈Python协程
2020/06/17 Python
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
最耐用行李箱,一箱永流传:Briggs & Riley(全球终身保修)
2017/12/07 全球购物
Sneaker Studio波兰:购买运动鞋
2018/04/28 全球购物
无毒社区工作方案
2014/05/23 职场文书
缓刑人员思想汇报500字
2014/09/12 职场文书
2014年禁毒工作总结
2014/11/24 职场文书
捐款仪式主持词
2015/07/04 职场文书
浅谈PHP7中的一些小技巧
2021/05/29 PHP
手把手教你用SpringBoot将文件打包成zip存放或导出
2021/06/11 Java/Android
Python办公自动化PPT批量转换操作
2021/09/15 Python
JS数组去重详情
2021/11/07 Javascript
Python3的进程和线程你了解吗
2022/03/16 Python