在只给定目标节点的情况下,是否有可靠的算法来生成健壮的DOM节点选择器?

在只给定目标节点的情况下,是否有可靠的算法来生成健壮的DOM节点选择器?,dom,xpath,jquery-selectors,css-selectors,Dom,Xpath,Jquery Selectors,Css Selectors,在编写scraper时,我们通常使用某种选择器来识别感兴趣的特定节点。理想情况下,即使页面随时间变化,选择器也应继续工作。许多常见的方法,如通过id抓取节点,在频繁更新的页面上是脆弱的,在某些节点上是不可能的。我试图找到生成健壮选择器的好算法,但由于似乎没有一个标准的术语来描述这个问题,所以很难找到所有存在的东西 以下是我已经知道的选择器DSL XPath选择器-从JS到流行的 Python和Ruby抓取库 CSS选择器-在许多可以找到xpath的地方都可以找到 选择器 高级选择器-这里我将给

在编写scraper时,我们通常使用某种选择器来识别感兴趣的特定节点。理想情况下,即使页面随时间变化,选择器也应继续工作。许多常见的方法,如通过id抓取节点,在频繁更新的页面上是脆弱的,在某些节点上是不可能的。我试图找到生成健壮选择器的好算法,但由于似乎没有一个标准的术语来描述这个问题,所以很难找到所有存在的东西

以下是我已经知道的选择器DSL

  • XPath选择器-从JS到流行的 Python和Ruby抓取库
  • CSS选择器-在许多可以找到xpath的地方都可以找到 选择器
  • 高级选择器-这里我将给出Chickenfoot的示例, 它允许用户编写
    单击(“开始教程”)
    查找链接 在“开始教程”文本中,通常这些都是在 xpath和CSS选择器。我很想了解更多的会员 这个语系
  • 视觉选择器-例如,这将是, Sikuli,使程序看起来好像在调用 在相关节点的屏幕抓图上运行。我什么都不知道 这种方法的特定于web的实例,但我认为有 一些
以下是我已经知道的选择器生成算法。我所说的选择器生成算法是指将节点作为输入并生成健壮的选择器作为输出的算法

  • iMacros:查找与节点类型和文本相同的所有元素 目标元素,在此列表中查找目标元素的索引。使用 作为选择器的节点类型、文本和索引。还包括id 用于窗体和窗体元素
  • CoScripter:使用元素的文本(如果可用)。如果不是,则使用前面的 文本
  • Selenium:在可用的地方使用id。使用各种其他属性 否则,例如图像alt文本、链接“显示的文本、按钮” 显示文本
  • Wargo系统:使用元素文本
  • 许多系统:许多系统使用从根节点到目标节点的xpath,或者 该xpath的后缀

所有这些选择器生成算法在某些节点上都失败。有更好的方法吗?或者其他方法,我可以结合这些算法来产生更好的混合算法?

当我开始为我正在做的一些工作调查这个主题时,我也很惊讶关于这个主题的信息是如此之少

我确实找到了这篇2003年的论文,但不幸的是,我只能获得摘要:

为了我自己的使用,我在年采用了这种方法。我不会重现该链接中可用的代码,但我将描述它:

它递归地从元素向上遍历DOM树,并“向后”构建选择器。在每一级:

  • 如果节点有ID,只需使用该ID并跳过所有父节点;它们不会添加到选择器中
  • 如果节点的标记名或一组类在其同级中是唯一的,则将其用作选择器。否则,请使用第n个子项

  • 由于我将在访问页面之间存储元素内容,因此我考虑在这里实现一些“错误检测”,可能使用上次访问的百分比变化来检测选择器是否抓取了错误的元素。

    选择器和XPath都与文档树结构紧密耦合。除了不可变的ID之外,无论文档结构如何变化,都无法确保您识别正确的元素。我当然同意您的观点,没有办法确保正确的答案,但我也从经验上发现,上面的一些算法比其他算法工作得更好。我不寻求任何保证,但我在寻找总体上效果良好的方法。