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

作者:hebedich 时间:2022-09-29 15:53:39 

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

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

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

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

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

步骤:

       首先清除网页中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,抓取网页正文
0
投稿

猜你喜欢

  • python实现通过队列完成进程间的多任务功能示例

    2022-06-25 03:49:27
  • 使用python求解迷宫问题的三种实现方法

    2022-10-25 01:16:35
  • Go pprof内存指标含义备忘录及案例分析

    2024-05-21 10:19:46
  • python MNIST手写识别数据调用API的方法

    2021-05-13 19:20:45
  • MySQL数据库表修复 MyISAM

    2024-01-19 16:39:08
  • JavaScript 浮动定位提示效果实现代码第1/2页

    2023-07-22 23:26:19
  • 一文解答什么是MySQL的回表

    2024-01-18 02:41:56
  • 游戏的用户体验营销小札

    2009-08-30 15:13:00
  • 浅析vue中的nextTick

    2024-04-26 17:42:21
  • 简单了解Javscript中兄弟ifream的方法调用

    2024-04-22 22:29:30
  • django filters实现数据过滤的示例代码

    2023-11-20 03:59:22
  • python中requests库+xpath+lxml简单使用

    2021-04-08 05:24:16
  • golang中字符串MD5生成方式总结

    2024-04-23 09:41:05
  • Python的Flask框架中集成CKeditor富文本编辑器的教程

    2022-08-25 11:26:22
  • mysql主键,外键,非空,唯一,默认约束及创建表的方法

    2024-01-17 18:18:06
  • 在python中使用[[v]*n]*n遇到的坑及解决

    2022-02-03 10:31:35
  • python 遗传算法求函数极值的实现代码

    2023-08-29 11:36:11
  • 数据库中两张表之间的数据同步增加、删除与更新实现思路

    2024-01-21 18:50:24
  • PHP使用PHPexcel导入导出数据的方法

    2024-05-13 09:21:10
  • Python实现列表删除重复元素的三种常用方法分析

    2022-02-17 20:21:36
  • asp之家 网络编程 m.aspxhome.com