使用 * vs 元素标签
Using * vs Element Tag
我正在编写一个脚本来从网上抓取一些数据。
我直接从浏览器复制了不同页面上一些相同元素的 XPath,生成 //*[@id="priceblock_dealprice"]
。
但是,它们都是 span
元素。我不太了解 XPath 的工作原理,但我假设 //span[@id="priceblock_dealprice"]
显然会更快,因为它只需要检查 span
元素?这是真的吗?
在这个特定的上下文中使用 *
比 span
有什么好处吗?
将 *
更改为 span
后,您不太可能会看到巨大的性能差异。
更大的性能影响是消除或至少限制后代轴 //
。
使用从根节点开始的后代轴,您将迫使 XPath 引擎遍历整个节点树并检查每个元素,这对于大型文档来说可能很昂贵。
如果你提供任何关于结构的线索,引擎可以避免很多不必要的工作,并且应该表现得更好。
例如:
/html/body/section[2]/div//*[@id="priceblock_dealprice"]
除了性能之外,其他考虑因素是维护和灵活性。
使用更具体的 XPath 可能会获得更好的性能,但随后更改页面结构和元素名称可能会导致内容不再匹配。您需要决定什么更重要。
是的,最好使用 'span' 而不是 *,但是因为它有一个 ID,所以最好使用 By.ID 而不是 XPath。
与 Xpath 相比,ID 会快一些。
我正在编写一个脚本来从网上抓取一些数据。
我直接从浏览器复制了不同页面上一些相同元素的 XPath,生成 //*[@id="priceblock_dealprice"]
。
但是,它们都是 span
元素。我不太了解 XPath 的工作原理,但我假设 //span[@id="priceblock_dealprice"]
显然会更快,因为它只需要检查 span
元素?这是真的吗?
在这个特定的上下文中使用 *
比 span
有什么好处吗?
将 *
更改为 span
后,您不太可能会看到巨大的性能差异。
更大的性能影响是消除或至少限制后代轴 //
。
使用从根节点开始的后代轴,您将迫使 XPath 引擎遍历整个节点树并检查每个元素,这对于大型文档来说可能很昂贵。
如果你提供任何关于结构的线索,引擎可以避免很多不必要的工作,并且应该表现得更好。
例如:
/html/body/section[2]/div//*[@id="priceblock_dealprice"]
除了性能之外,其他考虑因素是维护和灵活性。
使用更具体的 XPath 可能会获得更好的性能,但随后更改页面结构和元素名称可能会导致内容不再匹配。您需要决定什么更重要。
是的,最好使用 'span' 而不是 *,但是因为它有一个 ID,所以最好使用 By.ID 而不是 XPath。 与 Xpath 相比,ID 会快一些。