Web scraping 我如何才能刮一个网站的导航菜单只
我正在建立一个程序,可以刮去一个网站。它查看整个网站,只从该网站获取页眉和页脚导航菜单,然后在页眉和页脚菜单之间插入新的html标记(div、p、table等) 我正在寻找一些关于如何仅剥离页眉和页脚导航菜单以及在两者之间添加代码的想法 我正在使用Web scraping 我如何才能刮一个网站的导航菜单只,web-scraping,html-agility-pack,nav,scrape,navigationbar,Web Scraping,Html Agility Pack,Nav,Scrape,Navigationbar,我正在建立一个程序,可以刮去一个网站。它查看整个网站,只从该网站获取页眉和页脚导航菜单,然后在页眉和页脚菜单之间插入新的html标记(div、p、table等) 我正在寻找一些关于如何仅剥离页眉和页脚导航菜单以及在两者之间添加代码的想法 我正在使用htmlagilitypack,并研究了一些方法 方法1: 在大多数情况下,页眉和页脚导航菜单主要是 链接,并且几乎没有文本。我使用了一个阈值变量 是文本与链接的比率。如果节点的“文本:链接”比率为 小于阈值时,该节点将被视为菜单节点,并且 它会得救的
htmlagilitypack
,并研究了一些方法
方法1:
在大多数情况下,页眉和页脚导航菜单主要是
链接,并且几乎没有文本。我使用了一个阈值变量
是文本与链接的比率。如果节点的“文本:链接”比率为
小于阈值时,该节点将被视为菜单节点,并且
它会得救的。文本:链接比率大于的任何节点
阈值将被删除
方法1对某些站点有效,但对其他站点无效,所以我放弃了它
方法2:
我在每个节点上搜索包含“nav”的id或class属性
或“菜单”。“n”、“a”、“v”、“m”、“e”、“n”、“u”可能是大写或小写
小写字母,“导航”和“菜单”可能被任何
字符组合。这样,它将包括id和
类,如“bottomNav”、“navRight1”、“LeftMenu2”等
或包含“导航”或“菜单”的类,则将保存节点。
如果节点的属性不包含这些术语中的任何一个,或者
节点的子代中没有包含这两个术语中的任何一个
节点将被删除
同样,方法2适用于某些站点,但不适用于其他站点
对于使用这两种方法的站点,我仍然无法在两个菜单之间插入新的html代码,因为我无法判断页眉菜单的结束位置和页脚菜单的开始位置
我只是想了解如何从网站中只刮取页眉和页脚导航菜单,并在两者之间插入新的html代码的其他方法。除了寻找特定的元素或元素类(
页眉
,导航
,…),您可以尝试以不同的方式来看待问题:
- 首先,从每个网站获取并解析两个(或更多)页面,最好检查它们是否有很大差异(但不是完全不同)李>
- 然后,做一个diff(DOM,最好是DOM),只保留公共结构
最后一步可能是在这个通用结构中查找由页眉/页脚引起的小间隙(根据上下文而不同),而不是由不同(主)内容引起的大间隙,并从每个网站可以获取的最大页面集中刮取它们的可能值。这是一种很好的方法。我很想看看这个例子。我想您会使用python的difflib吗?另外,我也不确定“最好是DOM”是什么意思。@leeprovost,我不确定这些天我会用什么(我也不记得当时想到了什么特别的工具),但difflib似乎是一个完全合理的(文本差异)选择。通过区分“DOM,最好是”我的意思是对DOM树进行区分,而不是简单的HTML文本区分:使其对文档的结构进行操作(而不必对文本内容进行操作),并使其能够容忍可能从JS动态创建整个结构的站点。