【问题标题】:Using * vs Element Tag使用 * vs 元素标签
【发布时间】:2019-02-21 21:52:10
【问题描述】:

我正在编写一个脚本来从网络上抓取一些数据。

我直接从浏览器复制了不同页面上几个相同元素的 XPath,这会生成 //*[@id="priceblock_dealprice"]

但是,它们都是span 元素。我不太了解 XPath 如何在后台工作,但我假设 //span[@id="priceblock_dealprice"] 显然会更快,因为它只需要检查 span 元素?这是真的吗?

在这种特定情况下使用* 而不是span 有什么好处吗?

【问题讨论】:

  • 为什么要对有 ID 的东西使用 XPath?请改用By.id()。无论哪种方式,您都可以节省几毫秒......没什么大不了的。脚本中更可能的逻辑是减慢速度。唯一知道的方法是对您的代码进行一些分析,以查看时间花在了哪里。然后你可以解决慢的问题以及如何解决它。
  • @JeffC 为什么不使用 XPath?在 XPath 上使用 By.ID() 有什么好处?并不是我的代码很慢,我只是想知道明确选择 span 元素是否有任何好处,因为所有元素都是 span 元素,而不是像浏览器建议的那样使用通配符选择器跨度>
  • By.id() 速度更快,在所有浏览器中得到更好的支持,并且更清楚地指示您正在做什么。
  • By.id() 没有等价物,但您可以使用 CSS 选择器,它可能会快两倍...div[id*='100_dealView']
  • 是的,id*= 表示 id 包含。见this reference

标签: selenium xpath web-scraping screen-scraping


【解决方案1】:

是的,使用 'span' 代替 * 更好,但由于它有一个 ID,所以代替 XPath,最好使用 By.ID。 ID 会比 Xpath 快一些。

【讨论】:

  • 为什么By.ID 比使用 XPaths 快? By.XPATH 也比find_element_by_xpath 快吗??
  • @Anthony @id 在文档中是唯一的。通过 id 值查找的函数可能由 Map 或类似结构支持,允许通过该键进行快速有效的查找。 XPath 也有 id() w3.org/TR/xpath-functions/#func-id
  • seleniumeasy.com/selenium-tutorials/selenium-locators 在网页上定位元素的最有效方式和首选方式是通过 ID。 ID 将是网页上唯一可以轻松识别的 ID。
  • @MadsHansen 好的,但问题仍然存在:使用 XPath 搜索具有特定 ID 的元素与使用 By 搜索具有特定 ID 的元素之间有什么区别?该网页是用蹩脚的英文写的,并没有真正说明为什么使用一种方法搜索 ID 比另一种搜索 ID 的方法更快?
  • @MadsHansen 所以我不能这样做:items = WebDriverWait(driver, 60).until(EC.visibility_of_all_elements_located((By.XPATH, '//div[contains(@id, "100_dealView_")]'))) item.find_element(By.ID, 'dealImage').get_attribute('href')?你将如何重写那段代码?
【解决方案2】:

通过将* 更改为span,您不太可能看到巨大的性能差异。

更大的性能影响将是消除或至少限制后代轴//

使用从根节点开始的后代轴,您将强制 XPath 引擎遍历整个节点树并检查每个元素,这对于大型文档可能会很昂贵。

如果您要提供有关结构的任何线索,引擎可以避免很多不必要的工作,并且应该表现得更好。

例如:

/html/body/section[2]/div//*[@id="priceblock_dealprice"]

除了性能之外,其他考虑因素是维护和灵活性。

使用更具体的 XPath 可能会获得更好的性能,但随后更改页面结构和元素名称可能会导致内容不再匹配。您需要决定什么更重要。

【讨论】:

  • 提高效率的好方法!!没想到。我实际上一直在使用并且可能过度使用 // 轴,这可能是我的脚本在一段时间后变得如此缓慢的原因。
  • 你测试过性能差异吗?我的猜测是它可以忽略不计……大约在 50 毫秒以下。在 UI 自动化中,一旦您点击场景中的第二页,您甚至不会看到这种差异。如果您真的想快速运行,请在不需要时停止使用 XPath。 CSS 选择器的速度明显更快……至少是等效定位器的两倍。
猜你喜欢
  • 2017-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
相关资源
最近更新 更多