当前位置: 首页 > 编程笔记 >

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

卢深
2023-03-14
本文向大家介绍深度剖析使用python抓取网页正文的源码,包括了深度剖析使用python抓取网页正文的源码的使用技巧和注意事项,需要的朋友参考一下

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

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

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

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

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

步骤:

       首先清除网页中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])

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

 类似资料:
  • Libevent 是一个轻量级的开源高性能网络库,使用者众多,研究者更甚,相关文章也不少。写这一系列文章的用意在于,一则分享心得;二则对 libevent 代码和设计思想做系统的、更深层次的分析,写出来,也可供后来者参考。

  • 问题内容: 我正在尝试开发一个简单的网页抓取工具。我想提取没有代码的文本。我实现了这个目标,但是我发现在某些加载了的页面中,我没有获得良好的结果。 例如,如果一些代码添加了一些文本,则看不到它,因为当我调用 我得到的原始文本没有添加文本(因为在客户端执行了)。 因此,我正在寻找一些解决此问题的想法。 问题答案: 一旦安装了,请确保二进制文件在当前路径中可用: 例 举个例子,我用以下HTML代码创建

  • 我是python新手,正在尝试从以下站点获取数据。虽然这段代码适用于不同的站点,但我无法让它适用于nextgen stats。有人想知道为什么吗?下面是我的代码和我得到的错误 下面是我得到的错误 df11=pd。读取html(urlwk1)回溯(上次调用):文件“”,第1行,在文件“C:\Users\USERX\AppData\Local\Packages\PythonSoftwareFounda

  • 问题内容: 我想从网站上获取每天的日出/日落时间。是否可以使用Python抓取网络内容?使用什么模块?有没有可用的教程? 问题答案: 结合使用urllib2和出色的BeautifulSoup库:

  • 我想刮从多个网站与类似的网址的,如https://woollahra.ljhooker.com.au/our-team, https://chinatown.ljhooker.com.au/our-team和https://bondibeach.ljhooker.com.au/our-team. 我已经写了一个脚本,第一个网站的工作,但我不知道如何告诉它从其他两个网站刮。 我的代码: 有没有一种方

  • Fescar 简介 常见的分布式事务方式有基于 2PC 的 XA (e.g. atomikos),从业务层入手的 TCC( e.g. byteTCC)、事务消息 ( e.g. RocketMQ Half Message) 等等。XA 是需要本地数据库支持的分布式事务的协议,资源锁在数据库层面导致性能较差,而支付宝作为布道师引入的 TCC 模式需要大量的业务代码保证,开发维护成本较高。 分布式事务是