深度剖析使用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实现爬取需要登录的网站完整示例
Aug 19 Python
Python常见字符串操作函数小结【split()、join()、strip()】
Feb 02 Python
Python图像处理之颜色的定义与使用分析
Jan 03 Python
使用k8s部署Django项目的方法步骤
Jan 14 Python
python图像处理入门(一)
Apr 04 Python
django实现用户注册实例讲解
Oct 30 Python
python3图片文件批量重命名处理
Oct 31 Python
python实现tail实时查看服务器日志示例
Dec 24 Python
Python接口自动化判断元素原理解析
Feb 24 Python
python:删除离群值操作(每一行为一类数据)
Jun 08 Python
Django封装交互接口代码
Jul 12 Python
带你学习Python如何实现回归树模型
Jul 16 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
正则表达式语法
2006/10/09 Javascript
兼容性最强的PHP生成缩略图的函数代码(修改版)
2011/01/18 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
prototype 1.5 &amp; scriptaculous 1.6.1 学习笔记
2006/09/07 Javascript
JavaScript 撑出页面文字换行
2009/06/15 Javascript
javascript 折半查找字符在数组中的位置(有序列表)
2010/12/09 Javascript
javascript自启动函数的问题探讨
2013/10/05 Javascript
利用iscroll4实现轮播图效果实例代码
2017/01/11 Javascript
基于JavaScript实现下拉列表左右移动代码
2017/02/07 Javascript
Angular 4依赖注入学习教程之Injectable装饰器(六)
2017/06/04 Javascript
vue2.0页面前进刷新回退不刷新的实现方法
2018/07/31 Javascript
JS获取今天是本月第几周、本月共几周、本月有多少天、是今年的第几周、是今年的第几天的示例代码
2018/12/05 Javascript
微信小程序实现卡片层叠滑动效果
2019/06/21 Javascript
js字符串类型String常用操作实例总结
2019/07/05 Javascript
在vue中使用jsonp进行跨域请求接口操作
2020/10/29 Javascript
JS代码实现页面切换效果
2021/01/10 Javascript
[56:35]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第一局
2016/03/06 DOTA
Python中asyncore的用法实例
2014/09/29 Python
使用C语言扩展Python程序的简单入门指引
2015/04/14 Python
在Python的web框架中中编写日志列表的教程
2015/04/30 Python
python 时间戳与格式化时间的转化实现代码
2016/03/23 Python
Django自定义插件实现网站登录验证码功能
2017/04/19 Python
Python中列表list以及list与数组array的相互转换实现方法
2017/09/22 Python
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
2019/04/15 Python
如何通过python画loss曲线的方法
2019/06/26 Python
Django单元测试中Fixtures的使用方法
2020/02/26 Python
Python读取二进制文件代码方法解析
2020/06/22 Python
python3排序的实例方法
2020/10/20 Python
中国高端鲜花第一品牌:roseonly(一生只送一人)
2017/02/12 全球购物
Crabtree & Evelyn英国官网:瑰珀翠护手霜、香水、沐浴和身体护理
2018/04/26 全球购物
Linux文件操作命令都有哪些
2016/07/23 面试题
安全生产责任书范本
2014/04/15 职场文书
口才训练演讲稿范文
2014/09/16 职场文书
后进生评语大全
2015/01/04 职场文书
2016银行求职自荐信
2016/01/28 职场文书
Python数组变形的几种实现方法
2022/05/30 Python