深度剖析使用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获得linux下所有挂载点(mount points)的方法
Apr 29 Python
深入浅析ImageMagick命令执行漏洞
Oct 11 Python
fastcgi文件读取漏洞之python扫描脚本
Apr 23 Python
Python实现的括号匹配判断功能示例
Aug 25 Python
pygame游戏之旅 按钮上添加文字的方法
Nov 21 Python
对python:print打印时加u的含义详解
Dec 15 Python
一文了解Python并发编程的工程实现方法
May 31 Python
pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法
Aug 17 Python
Django项目创建到启动详解(最全最详细)
Sep 07 Python
golang/python实现归并排序实例代码
Aug 30 Python
微软开源最强Python自动化神器Playwright(不用写一行代码)
Jan 05 Python
python 实现的截屏工具
May 08 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使用PHPMailer发送邮件的简单使用方法
2013/11/12 PHP
从刷票了解获得客户端IP的方法
2015/09/21 PHP
PHP微信开发之根据用户回复关键词\位置返回附近信息
2016/06/24 PHP
PHP三种方式实现链式操作详解
2017/01/21 PHP
详解php中的implements 使用
2017/06/13 PHP
PHP十六进制颜色随机生成器功能示例
2017/07/24 PHP
PHPStudy下如何为Apache安装SSL证书的方法步骤
2019/01/23 PHP
PHP getDocNamespaces()函数讲解
2019/02/03 PHP
Yii2.0框架模型添加/修改/删除数据操作示例
2019/07/18 PHP
再论Javascript的类继承
2011/03/05 Javascript
关于javaScript注册click事件传递参数的不成功问题
2014/07/18 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
2014/08/04 Javascript
jQuery 实现侧边浮动导航菜单效果
2014/12/26 Javascript
基于jQuery的JavaScript模版引擎JsRender使用指南
2014/12/29 Javascript
PHP实现的各种中文编码转换类分享
2015/01/23 Javascript
JavaScript_object基础入门(必看篇)
2016/06/13 Javascript
基于javascript实现按圆形排列DIV元素(一)
2016/12/02 Javascript
Input文本框随着输入内容多少自动延伸的实现
2017/02/15 Javascript
JS实现简单的天数计算器完整实例
2017/04/28 Javascript
jQuery中ajax获取数据赋值给页面的实例
2017/12/31 jQuery
纯Python开发的nosql数据库CodernityDB介绍和使用实例
2014/10/23 Python
Python中内建函数的简单用法说明
2016/05/05 Python
Python 递归函数详解及实例
2016/12/27 Python
python利用有道翻译实现&quot;语言翻译器&quot;的功能实例
2017/11/14 Python
Python制作微信好友背景墙教程(附完整代码)
2019/07/17 Python
python使用 request 发送表单数据操作示例
2019/09/25 Python
Python导入父文件夹中模块并读取当前文件夹内的资源
2020/11/19 Python
2014年圣诞节倒计时网页的制作过程
2014/12/05 HTML / CSS
施华洛世奇水晶荷兰官方网站:SWAROVSKI荷兰
2017/05/12 全球购物
Kate Spade澳大利亚官方网站:美国设计师手袋品牌
2019/09/10 全球购物
北京大学自荐信范文
2014/01/28 职场文书
社区工作者感言
2014/03/02 职场文书
法定代表人授权委托书范文
2014/09/22 职场文书
教师党员先进性教育自我剖析材料思想汇报
2014/09/24 职场文书
德生TECSUN S-2000使用手册文字版
2022/05/10 无线电
一文搞懂PHP中的抽象类和接口
2022/05/25 PHP