深度剖析使用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调用C/C++动态链接库的方法详解
Jul 22 Python
介绍Python中几个常用的类方法
Apr 08 Python
Python实现高效求解素数代码实例
Jun 30 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
Dec 22 Python
Python Django Cookie 简单用法解析
Aug 13 Python
django认证系统实现自定义权限管理的方法
Aug 28 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
Dec 13 Python
python读取tif图片时保留其16bit的编码格式实例
Jan 13 Python
基于Numba提高python运行效率过程解析
Mar 02 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
Apr 24 Python
完美解决keras保存好的model不能成功加载问题
Jun 11 Python
python数据分析之用sklearn预测糖尿病
Apr 22 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 addslashes 函数详细分析说明
2009/06/23 PHP
PHP排序算法类实例
2015/06/17 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
基于Jquery实现表格动态分页实现代码
2011/06/21 Javascript
JavaScript自定义事件介绍
2013/08/29 Javascript
JavaScript打印网页指定区域的例子
2014/05/03 Javascript
jquery读取xml文件实现省市县三级联动的方法
2015/05/29 Javascript
javascript高级选择器querySelector和querySelectorAll全面解析
2016/04/07 Javascript
js 获取经纬度的实现方法
2016/06/20 Javascript
JS代码实现百度地图 画圆 删除标注
2016/10/12 Javascript
Bootstrap 3.x打印预览背景色与文字显示异常的解决
2016/11/06 Javascript
100行代码理解和分析vue2.0响应式架构
2017/03/09 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
2017/04/01 Javascript
使用jQuery卸载全部事件的思路详解
2017/04/03 jQuery
基于JavaScript实现新增内容滚动播放效果附完整代码
2017/08/24 Javascript
jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】
2018/08/28 jQuery
React 使用Hooks简化受控组件的状态绑定
2019/03/18 Javascript
20道JS原理题助你面试一臂之力(必看)
2019/07/22 Javascript
微信小程序vant弹窗组件的实现方式
2020/02/21 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
2020/04/10 Javascript
[50:50]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.20
2020/12/23 DOTA
Python中用Ctrl+C终止多线程程序的问题解决
2013/03/30 Python
基于Python的接口测试框架实例
2016/11/04 Python
python函数式编程学习之yield表达式形式详解
2018/03/25 Python
pytorch + visdom 处理简单分类问题的示例
2018/06/04 Python
Python利用pandas处理Excel数据的应用详解
2019/06/18 Python
Python实现迪杰斯特拉算法并生成最短路径的示例代码
2020/12/01 Python
css3制作动态进度条以及附加jQuery百分比数字显示
2012/12/13 HTML / CSS
详解CSS3原生支持div铺满浏览器的方法
2018/08/30 HTML / CSS
美国咖啡批发网站:Coffee.org
2017/06/29 全球购物
会计专业职业规划:规划自我赢取未来
2014/02/12 职场文书
初级会计求职信范文
2014/02/15 职场文书
百年校庆宣传标语口号
2015/12/26 职场文书
2019年中,最受大众欢迎的6本新书
2019/08/07 职场文书
利用Python实现翻译HTML中的文本字符串
2022/06/21 Python
windows server2008 开启端口的实现方法
2022/06/25 Servers