网页视频抓取脚本(基于行块分布函数的通用网页抽取算法(二)-最初)

优采云 发布时间: 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])

  从最后一个函数调用的代码。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线