`
ipython
  • 浏览: 293943 次
  • 性别: Icon_minigender_1
  • 来自: 佛山
社区版块
存档分类
最新评论

python 正文内容提取

阅读更多

正文提取:

 

平时打开一个网页,除了文章的正文内容,通常会有一大堆的导航,广告和其他方面的信息。本博客的目的,在于说明如何从一个网页中提取出文章的正文内容,而过渡掉其他无关的的信息。

 

这里先看看 demo : http://2.tingxinwen.duapp.com/extract_context

 

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

 

约定:

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

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

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

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

      

步骤:

       首先清除网页中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开发的提取文本中的三元组源码.rar

    基于python开发的提取文本中的三元组源码.rar基于python开发的提取文本中的三元组源码.rar基于python开发的提取文本中的三元组源码.rar基于python开发的提取文本中的三元组源码.rar基于python开发的提取文本中的三元...

    Python 如何批量提取Word文档的页码(并计算总页码)Python源码

    Python 如何批量提取Word文档的页码(并计算总页码)Python源码Python 如何批量提取Word文档的页码(并计算总页码)Python源码Python 如何批量提取Word文档的页码(并计算总页码)Python源码Python 如何批量提取Word...

    Python-提取矢量边界

    在IT行业中,尤其是在地理信息系统(GIS)和数据分析领域,"Python-提取矢量边界"是一个常见的任务。矢量数据是地理信息的一种表示形式,通常包括点、线和面,其中“边界”通常指的是区域的边缘或者轮廓。这个任务...

    Python代码gabor提取纹理特征

    最近一直在做提取纹理特征的用法,用gabor特征提取纹理特征,Python代码

    python屏幕颜色提取器

    Python屏幕颜色提取器是一种实用工具,它允许用户获取屏幕上任何位置的颜色信息,包括RGB、HEX和HSV值,并且能够方便地将这些值复制到剪贴板,以便于设计、编程或其他颜色匹配的工作中使用。这个工具的核心是利用...

    自动提取应力结果保存.zip_abaqus python_abaqus python应力_python提取应力_riceb3t_

    本文档将详细介绍如何使用Python脚本在ABAQUS中自动提取应力结果,以便于用户进行批量分析和数据管理。ABAQUS Python API(应用程序编程接口)为用户提供了丰富的功能,能够直接与ABAQUS的内部数据库交互,实现模型...

    Python实现使用卷积提取图片轮廓功能示例

    首先,本文主要讲解了如何使用Python语言结合卷积操作来提取图片的轮廓。这个过程涵盖了图像处理中的边缘检测技术,特别是使用了Sobel算子作为卷积核来实现。在实现这个功能的过程中,涉及到了Python的数值运算、...

    Python 提取Excel日期数据中的年、月、日 Python源码

    Python 提取Excel日期数据中的年、月、日 Python源码Python 提取Excel日期数据中的年、月、日 Python源码Python 提取Excel日期数据中的年、月、日 Python源码Python 提取Excel日期数据中的年、月、日 Python源码...

    python-opencv提取黄色区域

    python3-opencv提取图片中的黄色区域的部分,先转成HSV格式然后像素与操作

    python抓取数据包提取五元组

    抓取数据包:使用Python中的网络抓包库(如Scapy、pcapy、dpkt等),可以监听网络接口或读取存储在文件中的网络数据包。这些库提供了函数和方法来捕获和读取数据包。 解析数据包:对于每个捕获到的数据包,需要对其...

    抓取页面正文python版

    在Python编程领域,网页抓取是一项常见的任务,用于获取网页上的信息,比如正文内容。本教程将重点关注如何使用Python的BeautifulSoup库来抓取页面正文。BeautifulSoup是一个强大的解析库,能够帮助开发者从HTML和...

    基于python掌纹特征提取和分类任务

    掌纹识别项目,环境:win10, python3.7 pytorch 1.1.0 opencv 3.4.2.16(这个版本 才能用SIFT算法,4.0版本要收费!!) 本项目主要完成掌纹特征提取和分类任务。 数据集包含99张人的掌纹图片,其中每个人的4张掌纹...

    Python 如何提取中文地址描述中的省市区信息(str.split()内置方法)Python源码

    Python 如何提取中文地址描述中的省市区信息(str.split()内置方法)Python源码Python 如何提取中文地址描述中的省市区信息(str.split()内置方法)Python源码Python 如何提取中文地址描述中的省市区信息(str.split...

    Python 如何自动对多个Word文档提取目录 Python源码

    Python 如何自动对多个Word文档提取目录 Python源码Python 如何自动对多个Word文档提取目录 Python源码Python 如何自动对多个Word文档提取目录 Python源码Python 如何自动对多个Word文档提取目录 Python源码Python ...

    基于Python的提取照片中的EXFI信息,支持批量提取

    本教程将深入探讨如何使用Python语言来批量提取照片中的EXIF信息。 首先,我们需要了解Python中用于处理图像元数据的库。`PIL`(Python Imaging Library)是Python中最常用的图像处理库,但并不直接支持读取EXIF...

    Python语言版基于通用论坛的正文提取

    本项目专注于"Python语言版基于通用论坛的正文提取",它提供了从论坛帖子中抽取核心内容的方法,这对于分析用户讨论、情感分析、话题建模等应用具有极大的价值。 首先,我们需要了解"通用论坛"这一概念。通用论坛是...

    python骨架提取算法

    python骨架提取算法

    python加水印并提取水印代码

    python实现加水印并把水印提取出来的代码(只支持灰度图)

    cx-extractor 的 Python 版本,提取网页正文,添加了提取正文图片的功能.zip

    "cx-extractor 的 Python 版本,提取网页正文,添加了提取正文图片的功能.zip" 这个压缩包文件包含了一个名为 "cix-extractor-py-master" 的项目,这是一个使用 Python 编写的网页正文和相关图片提取工具。...

Global site tag (gtag.js) - Google Analytics