问题描述
假设我尝试抓取一个简单的html网页并创建一个如下类(在TypeScript中显示,但是问题与所选的编程语言无关):
class ScrapingTargetSpecification {
cssSelector: string;
context: ScrapingTargetSpecification | null;
constructor(cssSelector: string,context: ScrapingTargetSpecification | null) {
this.cssSelector = cssSelector;
this.context = context;
}
}
示例实例如下所示:
const soccerResultsTable = new ScrapingTargetSpecification("#soccerresults",null);
const soccerTeamNames = new ScrapingTargetSpecification("tr:nth-child(3)",soccerResultsTable);
const soccerMatchResults = new ScrapingTargetSpecification("tr:nth-child(7)",soccerResultsTable);
const baseballResultsTable = new ScrapingTargetSpecification("#baseballresults",null);
const baseballTeamNames = new ScrapingTargetSpecification("tr:nth-child(2)",baseballResultsTable);
const baseballMatchResults = new ScrapingTargetSpecification("tr:nth-child(4)",baseballResultsTable);
这显然已经形成了树/层次结构。
现在,我想汇总这些规范的“列表”,以便定义要抓取的整个网页的模型。我还希望能够通过名称解决各个目标规范。因此,我可以执行以下操作:
const pageModel = {
'soccerResultsTable': soccerResultsTable,'soccerTeamNames': soccerTeamNames,'soccerMatchResults': soccerMatchResults,'baseballResultsTable': baseballResultsTable,'baseballTeamNames': baseballTeamNames,'baseballMatchResults': baseballMatchResults
};
但是我更希望pageModel
的名称/键反映层次结构。因此,我可以引入“目录”分隔符(/)并执行以下操作:
const pageModel = {
'soccerResults': soccerResultsTable,'soccerResults/teamNames': soccerTeamNames,'soccerResults/matchResults': soccerMatchResults,'baseballResults': baseballResultsTable,'baseballResults/teamNames': baseballTeamNames,'baseballResults/matchResults': baseballMatchResults
};
对此建模的更好方法可能是使用前缀树(“ Trie”)作为名称。
这是问题所在:如何确保由值(此处为ScrapingTargetSpecification
)定义的层次结构与键(此处为名称)定义的层次结构相同?例如,有人可能会再次这样做:
const pageModel = {
'soccerResults': soccerResultsTable,'soccerTeamNames': soccerTeamNames
}
在新术语中,这是错误的,因为soccerTeamNames
是soccerResultsTable
的子级,因此不在根级别。
使用前缀树(或任何树)时,由于该树的每个节点都包含一个ScrapingTargetSpecification
作为其值(可能具有上下文/父项ScrapingTargetSpecification
),因此会出现相同的问题,以使节点值形成自己的层次结构,这可能与节点层次结构相矛盾。
当然,存在许多通过验证器或类似方法防止这种情况的方法。但是我对这种解决方案不感兴趣,而是觉得我自己的建模方法本身是错误的(可能是由于某种形式的隐藏冗余),我想知道如何做得更好。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)