网页视频抓取脚本(基于行块分布函数的通用网页抽取算法(二)-最初)
优采云 发布时间: 2022-03-26 04:17网页视频抓取脚本(基于行块分布函数的通用网页抽取算法(二)-最初)
此方法基于文本密度。最初的想法来自哈工大的《基于行块分布函数的通用网页文本提取算法》,本文在此基础上做了一些小修改。
约定:
本文根据网页的不同行进行统计。因此,假设网页内容没有被压缩,则说明网页有正常的换行符。
在某些新闻页面上,新闻的文本内容可能比较短,但其中嵌入了一个视频文件。所以,我会给视频更高的权重;这同样适用于图片。这里有一个缺点。大小来确定权重,但是本文的方法无法做到这一点。
导航这些非文字内容经常会因为广告出现超链接,所以文字会给超链接零文字权重。
这里假设文本的内容是连续的,中间不收录非文本内容。所以,其实提取文本内容就是找到文本内容的起止位置。
步骤:
先清除网页中CSS、Javascript、评论、Meta、Ins标签的内容,并清除空白行。
计算每一行的处理值(1)
计算上面得到的每行文本数的最大正子串的起止位置
第二步需要说明:
对于每一行,我们需要计算一个值,计算如下:
一个图片标签img,相当于长度为50个字符(给定权重)的文本,x1,
一个视频标签embed,相当于文本长度为1000个字符,x2
一行中所有链接的标签a的文本长度x3,
其他标签的文本长度 x4
每行数 = 50 * x1 出现次数 + 1000 * x2 出现次数 + x4 – 8
//说明,-8 因为我们要计算一个最大的正子串,所以需要减去一个正数。至于这个数字应该有多大,我觉得还是靠经验吧。
完整代码
复制代码代码如下:
#coding:utf-8
重新导入
def remove_js_css(内容):
""" 删除 javascript 和样式表以及评论内容(和)"""
r = 桩(r'''''',re.I|re.M|re.S)
s = r.sub('',内容)
r = 桩(r'''''',re.I|re.M|re.S)
s = r.sub('', s)
r = pile(r'''''', re.I|re.M|re.S)
s = r.sub('',s)
r = pile(r'''''', re.I|re.M|re.S)
s = r.sub('',s)
r = pile(r'''''', re.I|re.M|re.S)
s = r.sub('',s)
返回
def remove_empty_line(内容):
"""去掉多个空格"""
r = 桩(r'''^\s+$''', re.M|re.S)
s = r.sub('', 内容)
r = 桩(r'''\n+''',re.M|re.S)
s = r.sub('\n',s)
返回
def remove_any_tag(s):
s = re.sub(r''']+>''','',s)
返回 s.strip()
def remove_any_tag_but_a(s):
text = re.findall (r''']*>(.*?)''',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):
图像 = 'a' * n
r = 桩(r'''
''',re.I|re.M|re.S)
s = r.sub(图像,s)
返回
def remove_video (s,n=1000):
视频 = 'a' * n
r =桩(r'''''',re.I|re.M|re.S)
s = r.sub(视频,s)
返回
定义总和最大值(值):
cur_max = 值[0]
glo_max = -999999
左,右 = 0,0
对于索引,枚举中的值(值):
cur_max += 值
如果(cur_max > glo_max):
glo_max = cur_max
右 = 索引
elif (cur_max
cur_max = 0
for i in range(right, -1, -1):
glo_max -= 值[i]
如果 abs(glo_max
左 = 我
休息
返回左,右+1
def 方法_1(内容,k=1):
如果不满足:
返回无,无,无,无
tmp = content.split('\n')
group_value = []
对于范围内的 i(0,len(tmp),k):
group = '\n'.join(tmp[i:i+k])
group = remove_image(组)
group = remove_video(组)
text_a,text_b= remove_any_tag_but_a(组)
temp = (text_b - text_a) - 8
group_value.append (temp)
left,right = sum_max (group_value)
返回左,右,len('\n'.join(tmp[:left])),len('\n'.join(tmp[:right]))
def 提取(内容):
content = remove_empty_line(remove_js_css(content))
左、右、x、y = 方法_1(内容)
return '\n'.join(content.split('\n')[left:right])
从最后一个函数调用的代码。