gpt4 book ai didi

screen-scraping - Selenium RC CSS 定位器可能比 XPath 慢的原因是什么?

转载 作者:行者123 更新时间:2023-12-03 16:47:32 26 4
gpt4 key购买 nike

我有一些代码可以进行模拟递归树遍历,以使用 SeleniumRC 从 HTML 树中抓取内容。我已经使用 Xpath 和 CSS 定位器运行了代码。

树表示为一系列嵌套表。如果它很重要,一些树内容开始时是不可见的,因为分支被“折叠”了。对于 Xpath 和 CSS,树在可见和不可见方面处于相同的状态。

为了获取节点值,我的代码以“根”表达式开始,添加可以为每个连续的兄弟节点递增的“分支”标记,然后使用“节点”标记来获取文本内容。

这一切都有效,但使用我想出的 CSS 表达式要慢得多。

我想这是一种制作定位器表达式的笨拙方式,尽管它适用于我的目的。我只是想弄清楚如何最好地使用 CSS 来接近使用 Xpath 所涉及的时间。

该循环测试了许多无效的表达式(一直在寻找第 n 个兄弟直到找不到)并且表达式变得非常长,这是由于我越来越深入地钻入嵌套表的方式。

下面是来自递归的表达式和示例。如果有人可以提供一些关于我正在做的事情的见解,那就是让 CSS 花费比 Xpath 更长的时间,那将非常有帮助。

我完全是个新手,不擅长对 HTML 内容进行这种操作,如果您在我如何从 Xpath 迁移到 CSS 方面看到一些愚蠢的事情,请说出来。

XPath “ token ”:

final String rootbase = "//*[contains(@id,\"treeBox\")]/div";
// in next string, "{branchIncrement}" will be replaced with integer values from 2 to get to text content, and skip graphical elements
final String leveltoken = "/table/tbody/tr[{branchIncrement}]/td[2]";
final String nodetoken = "/table/tbody/tr/td[4]/span";

CSS“ token ”:
final String rootbase = "css=[id*=treeBox]>div";
// in next string, "{branchIncrement}" will be replaced with integer values from 2 to get to text content, and skip graphical elements
final String leveltoken = ">table>tbody>tr:nth-child({branchIncrement})>td:nth-child(2)";
final String nodetoken = ">table>tbody>tr>td:nth-child(4)>span";

“根”处内容的第一个 XPath 表达式是:
//*[contains(@id,"treeBox")]/div/table/tbody/tr[2]/td[2]/table/tbody/tr/td[4]/span

一个 40 节点树的最后一个 XPath 表达式有四个级别,每个级别在根 (1+3+3x3+3x3x3) 下的三个兄弟节点是:
//*[contains(@id,"treeBox")]/div/table/tbody/tr[2]/td[2]/table/tbody/tr[2]/td[2]/table/tbody/tr[3]/td[2]/table/tbody/tr[2]/td[2]/table/tbody/tr[2]/td[2]/table/tbody/tr/td[4]/span

第一个 CSS 表达式是:
[id*=treeBox]>div>table>tbody>tr:nth-child(2)>td:nth-child(2)>table>tbody>tr>td:nth-child(4)>span

最后一个 CSS 表达式是:
[id*=treeBox]>div>table>tbody>tr:nth-child(2)>td:nth-child(2)>table>tbody>tr:nth-child(2)>td:nth-child(2)>table>tbody>tr:nth-child(3)>td:nth-child(2)>table>tbody>tr:nth-child(2)>td:nth-child(2)>table>tbody>tr:nth-child(2)>td:nth-child(2)>table>tbody>tr>td:nth-child(4)>span

最佳答案

在 Firefox 中,Selenium RC 的 XPath 定位器由浏览器的 native XPath 引擎处理,CSS 定位器由 JavaScript 库 (Dean Edwards' cssQuery.js) 处理。后来的 Selenium 版本(例如 2.0b* 系列)使用 jQuery 的 sizzle CSS 库,但他们仍然使用 JavaScript。除了隐含的速度差异之外,您还在根表达式(即 [id*=treeBox )中进行模式匹配,这需要枚举整个 DOM 树以定位匹配项,甚至在您从那里下降之前。想想你是如何用纯 JavaScript 编写的,你就会开始看到问题所在。

如果它让你感觉更好,IE 仍然没有原生 XPath 实现,所以 Selenium 在那个浏览器中使用了几个 JavaScript 实现之一,它的速度是 Firefox 3.6 中 XPath 的二分之一到十分之一,因为那个。

长话短说,在这种特殊情况下,您无法使 CSS 定位器更快。

关于screen-scraping - Selenium RC CSS 定位器可能比 XPath 慢的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5670645/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com