深度剖析使用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 相关文章推荐
wxPython框架类和面板类的使用实例
Sep 28 Python
Python matplotlib画图实例之绘制拥有彩条的图表
Dec 28 Python
python Pandas如何对数据集随机抽样
Jul 29 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
Aug 27 Python
Python 单例设计模式用法实例分析
Sep 23 Python
vim自动补全插件YouCompleteMe(YCM)安装过程解析
Oct 21 Python
Python安装whl文件过程图解
Feb 18 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
Feb 25 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
Sep 29 Python
python中openpyxl和xlsxwriter对Excel的操作方法
Mar 01 Python
Python 实现绘制子图及子图刻度的变换等问题
May 31 Python
python数字图像处理:图像简单滤波
Jun 28 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
利用curl 多线程 模拟 并发的详解
2013/06/14 PHP
PHP+iFrame实现页面无需刷新的异步文件上传
2014/09/16 PHP
php中in_array函数用法探究
2014/11/25 PHP
ThinkPHP实现动态包含文件的方法
2014/11/29 PHP
PHP字符串中抽取子串操作实例分析
2019/06/22 PHP
stream.js 一个很小、完全独立的Javascript类库
2011/10/28 Javascript
常规表格多表头查询示例
2014/02/21 Javascript
使用不同的方法结合/合并两个JS数组
2014/09/18 Javascript
JavaScript中的数据类型转换方法小结
2015/10/26 Javascript
常用javascript表单验证汇总
2020/07/20 Javascript
js实现简单排列组合的方法
2016/01/27 Javascript
基于jquery实现智能提示控件intellSeach.js
2016/03/17 Javascript
jQuery qrcode生成二维码的方法
2016/04/03 Javascript
prototype.js简单实现ajax功能示例
2017/10/18 Javascript
react项目实践之webpack-dev-serve
2018/09/14 Javascript
vue.js多页面开发环境搭建过程
2019/04/24 Javascript
详解小程序退出页面时清除定时器
2019/04/28 Javascript
在vue中使用axios实现post方式获取二进制流下载文件(实例代码)
2019/12/16 Javascript
[02:35]DOTA2英雄基础教程 末日使者
2013/12/04 DOTA
[01:02:54]完美世界DOTA2联赛PWL S2 FTD vs GXR 第一场 11.22
2020/11/26 DOTA
2018年Python值得关注的开源库、工具和开发者(总结篇)
2018/01/04 Python
Django后台管理系统的图文使用教学
2020/01/20 Python
Python 常用日期处理 -- calendar 与 dateutil 模块的使用
2020/09/02 Python
基于Python正确读取资源文件
2020/09/14 Python
英国泰坦旅游网站:全球陪同游览,邮轮和铁路旅行
2016/11/29 全球购物
台湾前三大B2C购物网站:MOMO购物网
2017/04/27 全球购物
美国全球旅游运营商:Pacific Holidays
2018/06/18 全球购物
Derek Rose官网:英国高档睡衣、家居服和内衣品牌
2020/01/18 全球购物
硕士研究生自我鉴定
2013/11/08 职场文书
艺术设计专业求职自荐信
2014/05/19 职场文书
节能环保口号
2014/06/12 职场文书
计划生育个人总结
2015/03/02 职场文书
销售开票员岗位职责
2015/04/15 职场文书
2019年度开业庆典祝福语大全!
2019/07/05 职场文书
python基础入门之字典和集合
2021/06/13 Python
python 字典和列表嵌套用法详解
2021/06/29 Python