Javascript 推广XPath

Javascript 推广XPath,javascript,xml,firefox,machine-learning,Javascript,Xml,Firefox,Machine Learning,我想寻求您的帮助,解决一个涉及XPath的问题 我试图概括用户提供的多个XPath,以获得最“适合”所提供的所有示例的XPath。这是一个网页抓取系统,我正在建设 例如:如果用户给出以下XPath,每个XPath都指向谷歌新闻页面“聚光灯”部分的链接 好例子: 错误示例:指向另一节中的链接 它应该能够泛化并生成一个xpath表达式,用于选择“Spotlight”部分中的所有链接。它应该能够抛出给定的错误xpath 广义XPath 你能告诉我怎么做吗。我曾考虑使用最长的通用子字符串策略,但如果给出

我想寻求您的帮助,解决一个涉及XPath的问题

我试图概括用户提供的多个XPath,以获得最“适合”所提供的所有示例的XPath。这是一个网页抓取系统,我正在建设

例如:如果用户给出以下XPath,每个XPath都指向谷歌新闻页面“聚光灯”部分的链接

好例子:

错误示例:指向另一节中的链接

它应该能够泛化并生成一个xpath表达式,用于选择“Spotlight”部分中的所有链接。它应该能够抛出给定的错误xpath

广义XPath

你能告诉我怎么做吗。我曾考虑使用最长的通用子字符串策略,但如果给出了一个像第四个示例这样的坏示例,那么这将过度概括。在这方面是否有任何库或开源软件

我看到了一些类似的帖子,但是他们谈论的是最长的共同祖先

我用Javascript编写它,作为firefox扩展的一种形式


感谢您的时间和任何帮助将不胜感激

这里的问题是自动机最小化问题。所以你有Xpath1 | Xpath2 | Xpath3,你想得到匹配相同节点的最小自动机Xpath4。还有一个关于最小化信息丢失与否的问题,比如JPEG。为了精确最小化,你可以用谷歌搜索有限状态自动机最小化算法

好的,最简单的方法是在将每个Xpath运算符转换为字符并从字符串列表中运行基于字符的子字符串查找器之后,查找公共子序列。例如,我们有

adcba、acba、adba-公共子字符串->aba-常规注册表exp->a.*b.*a-转换回xpath->


您也可以尝试设置一些不太一般的内容来代替。*

问题出在哪里还不清楚。您还没有定义什么是坏的XPath表达式,什么是好的XPath表达式。此外,您还没有定义在输入错误表达式时要执行的操作。请编辑您的问题,并尽可能仔细、准确地定义问题。嗨,Dimitre,使用上述示例,假设用户希望从google新闻的spotlight部分提取所有链接,他可以给出指向“spotlight”链接的XPath的几个示例。假设他意外地给出了一个“坏”的示例-一个随机的xpath到其他内容,系统不应该落入陷阱,并尝试对其进行泛化,以覆盖“坏”的xpath。@user649851:看起来您想要的是最内部的几乎相同的祖先,以及来自给定节点集的更多后代。当节点集中的节点来自同一文档时,它们至少有一个共同的祖先:最坏情况下的根元素。所以,如果你想要最里面的,那就意味着你必须将deph与这个共同的祖先进行比较。此外,因为您希望从节点集选择节点几乎是普通的,所以您不会考虑。我认为,这两个过程使得单个XPath表达式无法执行此任务。@user649851:XPath标记用于定义良好的问题,而您的标记则不适用。除非你定义什么是坏问题,什么是好问题。。。我认为这些都是道德概念,不可能成为精确的科学或工程学科的主题。这绝对不是XPath问题。
/html/body/div[@id='page']/div/div[@id='main-wrapper']/div[@id='main']/div/div/div[3] /div[1]/table[@id='main-am2-pane']/tbody/tr/td[@id='rt-col']/div[3]/div[@id='s_en_us:ir']/div[2]/div[1]/div[2]/a[@id='MAE4AUgAUABgAmoCdXM']/span

/html/body/div[@id='page']/div/div[@id='main-wrapper']/div[@id='main']/div/div/div[3]/div[1]/table[@id='main-am2-pane']/tbody/tr/td[@id='rt-col']/div[3]/div[@id='s_en_us:ir']/div[2]/div[6]/div[2]/a[@id='MAE4AUgFUABgAmoCdXM']/span

/html/body/div[@id='page']/div/div[@id='main-wrapper']/div[@id='main']/div/div/div[3]/div[1]/table[@id='main-am2-pane']/tbody/tr/td[@id='rt-col']/div[3]/div[@id='s_en_us:ir']/div[2]/div[12]/div[2]/a[@id='MAE4AUgLUABgAmoCdXM']/span
/html/body/div[@id='page']/div/div[@id='main-wrapper']/div[@id='main']/div/div/div[3]/div[1]/table[@id='main-am2-pane']/tbody/tr/td[@id='lt-col']/div[2]/div[@id='replaceable-section-blended']/div[1]/div[4]/div/h2/a[@id='MAA4AEgFUABgAWoCdXM']/span
/html/body/div[@id='page']/div/div[@id='main-wrapper']/div[@id='main']/div/div/div[3]/div[1]/table[@id='main-am2-pane']/tbody/tr/td[@id='rt-col']/div[3]/div[@id='s_en_us:ir']/div[2]/div/div[2]/a[@id='MAE4AUgLUABgAmoCdXM']/span