范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

提取任意网页核心内容像搜索引擎一样精准

  作者:李晓飞
  来源:Python 技术
  爬虫程序想必大家都很熟悉了,随便写一个就可以获取网页上的信息,甚至可以通过请求 自动生成 Python 脚本[1] 。
  最近我遇到一个爬虫项目,需要爬取网上的文章。感觉没有什么特别的,但问题是没有限定爬取范围,意味着没有明确的页面的结构。
  对于一个页面来说,除了核心文章内容外,还有头部,尾部,左右列表栏等等。有的页面框架用 p 布局,有的用 table,即使都用 p,不太的网站风格和布局也不同。
  但问题必须解决,我想,既然搜索引擎抓取到各种网页的核心内容,我们也应该可以搞定,拎起 Python, 说干就干! 各种尝试
  如何解决呢? 生成PDF
  开始想了一个取巧的方法,就是利用工具( wkhtmltopdf[2] )将目标网页生成 PDF 文件。
  好处是不必关心页面的具体形式,就像给页面拍了一张照片,文章结构是完整的。
  虽然 PDF 是可以源码级检索,但是,生成 PDF 有诸多缺点:
  耗费计算资源多、效率低、出错率高,体积太大。
  几万条数据已经两百多G,如果数据量上来光存储就是很大的问题。 提取文章内容
  不生成PDF,有简单办法就是通过  xpath[3]  提取页面上的所有文字。
  但是内容将失去结构,可读性差。更要命的是,网页上有很多无关内容,比如侧边栏,广告,相关链接等,也会被提取下来,影响内容的精确性。
  为了保证有一定的结构,还要识别到核心内容,就只能识别并提取文章部分的结构了。 像搜索引擎学习,就是想办法识别页面的核心内容。
  我们知道,通常情况下,页面上的核心内容(如文章部分)文字比较集中,可以从这个地方着手分析。
  于是编写了一段代码,我是用  Scrapy[4]  作为爬虫框架的,这里只截取了其中提取文章部分的代码 :ps = response.xpath("body//p") sel = None maxvalue = 0 for d in ps:   ds = len(d.xpath(".//p"))   ps = len(d.xpath(".//p"))   value = ps - ds   if value > maxvalue:     sel = {       "node": d,       "value": value     }     maxvalue = value  print("".join(sel["node"].getall())) response  是页面的一个响应,其中包含了页面的所有内容,可以通过 xpath  提取想要的部分"body//p"  的意思是提取所以 body  标签下的 p  子标签,注意://  操作是递归的遍历所有提取到的标签,计算其中包含的  p  数量,和 p  数量p  数量 和 p  数量的差值作为这个元素的权值,意思是如果这个元素里包含了大量的 p  时,就认为这里是文章主体通过比较权值,选择出权值最大的元素,这便是文章主体 得到文章主体之后,提取这个元素的内容,相当于  jQuery[5]  的 outerHtml
  简单明了,测试了几个页面确实挺好。
  不过大量提取时发现,很多页面提取不到数据。仔细查看发现,有两种情况。 有的文章内容被放在了    标签里了,所以没有获取到有的文章每个
  外面都包裹了一个  ,所以 p  的数量 和 p  的抵消了
  再调整了一下策略,不再区分  p ,查看所有的元素。
  另外优先选择更多的  p ,在其基础上再看更少的 p 。调整后的代码如下:ps = response.xpath("body//*") sels = [] maxvalue = 0 for d in ps:   ds = len(d.xpath(".//p"))   ps = len(d.xpath(".//p"))   if ps >= maxvalue:     sel = {       "node": d,       "ps": ps,       "ds": ds     }     maxvalue = ps     sels.append(sel)  sels.sort(lambda x: x.ds)  sel = sels[0]  print("".join(sel["node"].getall())) 方法主体里,先挑选出  p  数量比较大的节点,注意 if  判断条件中 换成了 >=  号,作用时筛选出同样具有 p  数量的结点经过筛选之后,按照  p  数量排序,然后选取 p  数量最少的
  经过这样修改之后,确实在一定程度上弥补了前面的问题,但是引入了一个更麻烦的问题。
  就是找到的文章主体不稳定,特别容易受到其他部分有些  p  的影响。选择最优
  既然直接计算不太合适,需要重新设计一个算法。
  我发现,文字集中的地方是往往是文章主体,而前面的方法中,没有考虑到这一点,只是机械地找出了最大的  p 。
  还有一点,网页结构是个颗  DOM 树[6]
  那么越靠近  p  标签的地方应该越可能是文章主体,也就是说,计算是越靠近 p  的节点权值应该越大,而远离 p  的结点及时拥有很多 p  但是权值也应该小一点。
  经过试错,最终代码如下: def find(node, sel):     value = 0     for n in node.xpath("*"):         if n.xpath("local-name()").get() == "p":             t = "".join([s.strip() for s in (n.xpath("text()").getall() + n.xpath("*/text()").getall())])             value += len(t)         else:             value += find(n, a)*0.5     if value > sel["value"]:         sel["node"] = node         sel["value"] = value     return value  sel = {     "value": 0,     "node": None } find(response.xpath("body"), sel) 定义了一个  find  函数,这是为了方便做递归,第一次调用的参数是 body  标签,和前面一样进入方法里,只找出该节点的直接孩子们,然后遍历这些孩子 判断如果孩子是  p  节点,提取出其中的所有文字,包括子节点的,然后将文字的长度作为权值提取文字的地方比较绕,先取出直接的文本,和间接文本,合成  list ,对每部分文本做了去除前后空字符,最后合并为一个字符串,得到了所包含的文本如果孩子节点不是  p ,就递归调用 find  方法,而 find  方法返回的是 指定节点所包含的文本长度在获取子节点的长度时,做了缩减处理,用以体现距离越远,权值越低的规则 最终通过 引用传递的  sel  参数,记录权值最高的节点
  通过这样改造之后,效果特别好。
  为什么呢?其实利用了密度原理,就是说越靠近中心的地方,密度越高,远离中心的地方密度成倍的降低,这样就能筛选出密度中心了。
  50% 的坡度比率是如何得到的呢?
  其实是通过实验确定的,刚开始时我设置为 90%,但结果时  body  节点总是最优的,因为 body  里包含了所有的文字内容。
  反复实验后,确定 50% 是比较好的值,如果在你的应用中不合适,可以做调整。 总结
  描述了我如何选取文章主体的方法后,后没有发现其实很是很简单的方法。而这次解决问题的经历,让我感受到了数学的魅力。
  一直以来我认为只要了解常规处理问题的方式就足以应对日常编程了,可以当遇到不确定性问题,没有办法抽取出简单模型的问题时,常规思维显然不行。
  所以平时我们应该多看一些数学性强的,解决不确定性问题的方法,以便提高我们的编程适应能力,扩展我们的技能范围。

5G将至,未来已来创业邦研究中心结合5G热点,经过对相关资料的研究,并与多位业内人士进行交流讨论,完成了这篇文章。以下为文章的上篇,请欣赏。程奎元作品创业邦研究中心出品刚刚过去的寒冬似乎根本没有浇灭英特尔和高通公司展示兼容M。2插槽的5G模块英特尔合作伙伴Fibocom宣布推出一款M。2模块,该模块采用英特尔XMM81605G调制解调器,用于CPE以及即将推出的个人电脑和笔记本电脑。在世界移动通信大会期间,我们在Fib全球首个AI合成女主播亮相两会搜狗分身技术全球领先中新网3月5日电3月3日,全球首个AI合成女主播新小萌正式上岗新华社,而她的第一个工作任务,便参与到十三届全国人大二次会议(后文简称两会)报道中。对此,今日俄罗斯电视台网站英国Da微软win10发布2019年02累积更新修复大量问题,赶快下载更新2019年3月1日,微软为Windows10version1809andWindowsServer2019发布了2019年02累积更新补丁KB4482887,同步更新了基于X86X特斯拉Model3疑似被禁售?你爸爸永远是你爸爸AuthorConstantinel就在准备发稿前的10分钟内,2019年3月4日晚10点多(北京时间),收到酷乐车友LuLu发来的一张截图。这意味着,特斯拉Model3可能在中国恒隆太古万达新城九龙仓2018业绩,商业地产或提前入春商业地产租金收益都有不同程度增长,商业地产或将在2019年迎来一轮新的增长期受到零售核心模式逐渐从线上回归到线下趋势影响,包括恒隆新城太古在内的,不少以商业地产开发租赁为主业的房企酷睿i99900K加持雷神ForceT8Ti游戏主机评测说起i99900K大家一定不陌生,从发布之初就头戴各种光环,比如首次将i9序列从高端桌面平台下放到主流桌面平台英特尔首款主流桌面8核心16线程处理器首次采用全新的十二面体包装等等,支付宝这个功能一定要关掉!越快越好,否则可能会被偷偷的扣费!小编最近遇到一个特别奇怪的事情,那就是我支付宝里面的余额了少了30块。一查源头,我就明白了,是来自网易云音乐的黑胶会员代扣费。三个月参加了1元开通网易云会员的活动,这个活动当是需要怎么将手机上的画面投到电脑屏幕上?手机投屏到电脑屏幕,拥有更好的显示效果,并且可以利用键盘鼠标进行一些操作,比如玩吃鸡游戏。投屏的方式比较多,有无线投屏方式和有线投屏方式,下文具体说一说。方式1使用win10自带的如何用30分钟快速优化家中WiFi?阿里工程师有绝招摘要现代人离不开手机,更离不开WiFi。很多同学经常吐槽家中WiFi用得不爽,打游戏看视频又卡又慢。阿里妹导读现代人离不开手机,更离不开WiFi。很多同学经常吐槽家中WiFi用得不面试必会八大排序算法(Python)作者ls秦原文httpsblog。csdn。netqq38328378articledetails85037315一插入排序介绍插入排序的基本操作就是将一个数据插入到已经排好序的有
三星GalaxyS21Ultra夜景拍摄到底有多强?看完这些图你就知道了晚上夜跑,无风,水面平静,随手一拍EXIF信息0220厂商samsung型号SMG9980光圈2。4ISO400曝光时间0。0303时间20220116193423EXIF信息02无广告的电视盒子泰捷WEBOXWE60C2电视盒子电视是我们日常生活中必不可少的家电,从最开始的简单天线,再到后来的各种大锅小锅,随着网络的普及以及电视的智能化,看电视不再依靠天线大锅小锅,只要接上网就可以随便看,市场上也随即出现荣耀Note20回归,5300mAh100W,天玑9000坐镇根据相关数据显示,苹果重新夺得了全球销量第一的位置,不过这也是意料之中的事,有些智能手机品牌可能会说冲击高端市场受影响是因为iPhone13系列太强了,这也确实如此。自打十月份上市2022好物种草,贱驴侍从无线游戏鼠标,游戏时的守护者贱驴品牌我也是有过一些了解,它诞生于2014年2月14日,对于产品的研发还是推广都不走寻常路,很多外设玩家对这个品牌印象深刻。曾经的白色款贱驴325绝尘游戏鼠标,现在依然能够想起它一网打尽移动固态硬盘横评本内容来源于什么值得买APP,观点仅代表作者本人作者善生的善生萨瓦迪卡,我是善生。一网打尽系列是我从16年开始做的,横评类选购指南内容,算上这篇已经是第八篇了。这次依然是消费向横评春节换手机?这几款手机堪称神机,一个比一个能打春节换手机的可以考虑这几款,款款堪称神机,一个比一个能打第一款iPhone13在性能方面iPhone13搭载了A15仿生芯片,支持5G,性能更胜以往,虽然13搭载的是残血版A15,MIUI开了这几个设置,可以省电并提升流畅度,全小米手机通用可能很多人都会遇到这样的情况,就是手机用着用着就没电了,不仅如此手机,用久了还会卡,所以,今天,给大家分享一下如何设置小米手机,才能既省电又能提高手机流畅度呢?毕竟小米手机的用户很美媒评出消费电子展最酷新品戴尔XPS13Plus笔记本电脑据美国新闻周刊网站1月5日报道,今年的消费电子展(CES)延续了为接下来的一年里我们可以期待的各种技术定下基调的传统。新闻周刊刊文介绍了2022年美国消费电子展25款最酷的新产品装过年送爸妈什么礼物好?索爱E52高端收音机安排上春节将至,年味渐浓,眼瞅着全家团圆的幸福时光就要到来,想必很多小伙伴都期待着回家过年。那么,给父母的礼物都准备好了吗?不妨送台索爱E52高端WiFi网络收音机吧!兼顾传统收音与现代2021年全球电脑出货量数据公布,联想第一,宏碁第五近日,某数据调研机构公布了2021年全球电脑出货量报告。数据显示,去年全年共计341053千台,其中,联想82142千台,占比24。1排第一惠普74072千台,占比21。7排第二戴科技引领养身之道智能双膝护膝仪非常多人在登山大概大品质负重的环境下长时间的连接行走会有膝盖酸痛的环境出现,不要觉得这是中暮年人大概是行动员才会有的疑问,膝盖本身即是举止的过节软骨长时间高密度的行动几许都邑造成消