简单树匹配的算法介绍见博客。

首先将网页表示成DOM结构,然后利用简单树匹配算法计算两个网页之间的最大匹配结点数,从而得到网页结构相似度。

Similarity (T1,T2)=Simple TreeMatching (T1,T2)(∣T1∣+∣T2∣)/2\text { Similarity }\left(T_{1}, T_{2}\right)=\frac{\text { Simple TreeMatching }\left(T_{1}, T_{2}\right)}{\left(\left|T_{1}\right|+\left|T_{2}\right|\right) / 2}  Similarity (T1​,T2​)=(∣T1​∣+∣T2​∣)/2 Simple TreeMatching (T1​,T2​)​

其中,∣T1∣\left|T_{1}\right|∣T1​∣,∣T2∣\left|T_{2}\right|∣T2​∣ 分别表示两棵网页DOM树中结点数目,SimpleTreeMatching(T1,T2)\left(T_{1}, T_{2}\right)(T1​,T2​) 表示这两棵树的最大匹配结点数.

计算网页结构相似度

代码:

from __future__ import print_function
from __future__ import division
from __future__ import absolute_importimport urllib.request
from bs4 import BeautifulSoupdef getNodeNum(root):if root is None:return 0elif not hasattr(root, "children"):return 0else:res = 1# childrens = root.childrenfor ch in root.children:res += getNodeNum(ch)return resdef simpleTreeMath(root_a, root_b):"""利用动态规划,实现简单树匹配算法:param root_a::param root_b::return:"""if root_a is None or root_b is None:return 0if root_a.name != root_b.name:return 0if not hasattr(root_a, "children") or not hasattr(root_b, "children"):return 0#childrens_a = [x for x in root_a.children]childrens_b = [x for x in root_b.children]m = len(childrens_a)n = len(childrens_b)res_M = [[0 for j in range(n + 1)] for i in range(m + 1)]for i in range(1, m + 1):for j in range(1, n + 1):res_M[i][j] = max(res_M[i - 1][j], res_M[i][j - 1],res_M[i - 1][j - 1] + simpleTreeMath(childrens_a[i - 1], childrens_b[j - 1]))return res_M[m][n] + 1if __name__ == "__main__":url1 = "https://www.zhihu.com/"f = urllib.request.urlopen(url1, timeout=5).read()# 获取网页的html内容f = """<html><head><title>doc1</title></head><body><ol><li>Academic Service</li><li>Admission and Enrolment</li><li>Awards and Scholarships</li></ol>"""soup1 = BeautifulSoup(f, 'html.parser')root_a = soup1.html# url2 = "https://www.csdn.net/"# f = urllib.request.urlopen(url2, timeout=5).read()f = """<<html><head><title>doc2</title></head><body><ul><li>Strudent Union</li><ol><li>Representation</li><li>Arts & Leisure</li><li>Support</li></ol><li>Graduate Student</li><ol><li>Graduate Attributes</li><li>Graduate Centre</li><li>Graduate Union</li></ol></ul>"""soup2 = BeautifulSoup(f, 'html.parser')root_b = soup2.htmlres = simpleTreeMath(root_a, root_b)num_roota = getNodeNum(root_a)num_rootb = getNodeNum(root_b)sim_val = 2 * res / (num_roota + num_rootb)print(res)print(num_roota)print(num_rootb)print(sim_val)

结果:

4
8
15
0.34782608695652173

简单树匹配算法STM-实践篇相关推荐

  1. 简单树匹配算法STM-理论篇

    内容来自论文 @article{何昕2007基于简单树匹配算法的,title={基于简单树匹配算法的Web页面结构相似性度量},author={何昕 and 谢志鹏},journal={计算机研究与发 ...

  2. 简单树组织数据格式化为标准树组织数据

    概述 在工作中,很多时候会遇到树组织,但是从数据库里面查询出来的结果是一个简单的树组织,这就需要将简单的树组织转换为标准的树组织,以便使用,本文分享一个简单的function来实现简单到标准的转换. ...

  3. postgresql 遍历参数_PostgreSQL 对简单树的遍历

    昨天我用MysqL来实现了ORACLE的递归语句CONNECT BY, 看起来稍复杂些.今天来看看POSTGREsql如何实现ORACLE的CONNECT BY. 还是用昨天同样的表以及数据.POST ...

  4. 微信小程序简单树状图的实现

    由于微信没有树状图这个组件,自己做了个简简单单的树状图,有需要的可以参考下我这个. 先上图 实现了三级,如果有更多级别的需求,可以参考我的规律进行添加. 下面是wxml的代码 <view> ...

  5. Oracle 简单树查询

    2019独角兽企业重金招聘Python工程师标准>>> --oracle针对树型结构的查询 select lpad('-', level, '-') || ename from em ...

  6. Unity简单树状结构

    树状结构. 预制体 TreeView挂载TreeView脚本.Game是空物体.ShowItem是一张图片添加了Toggle组件,剩下的UGUI的Toggle物体. TreeViewControl控制 ...

  7. vue 使用orgChart,实现简单树状结构

    一.安装 npm install vue-orgchart -S 在min.js中 import 'vue-orgchart/dist/style.min.css' 二.模板 <template ...

  8. ztree 树怎么写 简单树 关键代码

    只上关键代码,花了我一天半的时间研究,不容易啊!!!!!!!!!!!!!!!!!!!!!!! //******************************************树树树ztree* ...

  9. hdu4911 简单树状数组

    题意:      给你一串数字,然后给你最多进行k次交换(只能交换相邻的)问交换后的最小逆序数是多少. 思路:      首先要知道的一个就是给你一个序列,每次只能交换相邻的位置,把他交换成一个递增序 ...

最新文章

  1. modin pandas 加速
  2. Linux C编程--打开和关闭流
  3. JTable动态显示隐藏列
  4. 通过实例代码理解WPF的Dispatcher
  5. 《Saas模式云原生数据仓库应用场景实践》激活数据生产力,让分析产生价值
  6. html布局(盒子)
  7. python MySQL 插入Elasticsearch
  8. html中给div设置的属性怎么样才能拿得到_HTML与CSS结合的三种方式:优先级比较...
  9. 爬虫框架:scrapy
  10. SQL SERVER 2005 T_SQL新的特性以及解决并发
  11. linux openh264 编译,在Linux下为Android构建openh264
  12. C语言函数二维数组传递方法
  13. Wavenet基础学习
  14. SpringBoot 2.0参数校验Hibernate Validator
  15. Garmin报警点完善计划
  16. python模块库下载_Python及其常用模块库下载及安装
  17. mysql如何创建视图语句_创建视图的语句
  18. JUCE框架教程(4)—— Slider Class入门
  19. Python代码画喜羊羊怎么画_Python画图的这几种方法,你学会了吗
  20. linux下Intel无线网卡驱动安装

热门文章

  1. 新工作 (2) : 准备
  2. html显示数据库的数据类型,将HTML插入mysql数据库,显示E类型
  3. PowerShell实现“机器人定时在企业微信群中发送消息”功能(下)
  4. 小程序 背景图 repeat_简单可爱的微信聊天背景图片
  5. CSS高级技巧【学习笔记】
  6. sonarqube查看问题
  7. android uri跳转导航,android:scheme 通过uri跳转到APP应用指定Activity
  8. 起动缓慢_世界最大柴油机为何是压缩空气起动?那么它到底是如何起动的呢?...
  9. differential forms
  10. try-catch lasterr