【问题标题】:How can I print closed text between the ::before and the ::after span in Python with Selenium?如何使用 Selenium 在 Python 中的 ::before 和 ::after 跨度之间打印封闭文本?
【发布时间】:2021-05-07 02:04:31
【问题描述】:

我正在使用 Python 进行编码,并使用 Selenium。
我必须在span 标记之间打印关闭的年份。

<div class="display_year">
  <span class="year">
   ::before
   "1989"
   ::after
  </span>
</div>

我没有使用 Selenium 的经验。 我试着写这个:

year = driver.find_element_by_xpath("//span::after[@class='year']")
print(year.text)

但它不起作用。 我猜是为了那个:: before ... :: after,因为这段代码打印了一个空字符串,它是span标签的内容,当它是::之前

请哪位大神告诉我如何写才能打印年份的内容,在这种情况下是“1989”?

最重要的是:在我展示的示例中,代码是 span class = "year" 。但是如果代码是 span class = "year something somethingelse",它会在语法上有所改变吗?

【问题讨论】:

  • 您是否尝试过类似 CSS 选择器div.display_year &gt; span.year 之类的简单方法?无论如何,这应该可以工作......即使 SPAN 标签上有额外的类。如果这不起作用,我的猜测是页面正在后台处理,这就是你得到一个空字符串的原因。您可能需要添加一个等待,直到文本不是空字符串。
  • @jeff 它不会打印伪元素内容它只会打印文本
  • @PDHide OP 说他想要的只是“1989”,而不是伪元素内容。
  • @Zeta22 你能提供这个页面的链接吗?我认为这可能是时间问题。
  • 作者已经在使用文本,他正在获得作者想要的年份

标签: python html selenium xpath text


【解决方案1】:
value = driver.execute_script("return window.getComputedStyle(document.querySelector('span.year'),':after').content);")

如果你想打印前元素使用上面的代码作为它的伪元素

https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle

如果您只想要年份,请使用

   driver.find_element_by_xpath("//span[contains (@class,'year')]").text

包含一个我会检查包含 year 的类,所以 year 和 year 的东西

你也可以使用 or 操作符

   driver.find_element_by_xpath("//span[@class='year' or @class='year somethin' ]").text

此检查以年份或年份为值的类

您也可以使用按类名或css查找,因为类名中的空格表示多个类。

driver.find_element_by_class_name("year")   # this won't check specific for span tag
driver.find_element_by_css_selector("span.year")

【讨论】:

  • 好的,我明白了。在我展示的示例中,代码是 ``` span class= "year"``` 。但是如果代码是 ``` span class= "year something somethingelse"``` 它会在语法上改变一些东西吗?
  • 只更改查询选择器 span.yearsomething (如果有空格则用 dot 更改) span.year.something
  • 所以我要写value = driver.execute_script("return window.getComputedStyle(document.querySelector('span.yearsomethingsomethingelse'),':after').content);")?
  • 是的,您可以在查询选择器中使用任何有效的 css 定位器,您只是说 get ComputedStyle from :after 使用 span.class 检测到的元素的伪元素,因此您可以在该标签内使用任何有效的 css iinside [class="soomthing else"] tag.class 标签[attribute="value"] 等
  • 我理解并感谢,但很抱歉告诉你它不起作用..我会再试一次
【解决方案2】:

要打印文本1989,您可以使用以下任一Locator Strategies

  • 使用css_selector

    print(driver.find_element(By.CSS_SELECTOR, "div.display_year > span.year.something.somethingelse").text)
    
  • 使用xpath

    print(driver.find_element(By.XPATH, "//div[@class='display_year']/span[@class='year something somethingelse']").text)
    

【讨论】:

  • 现在我已经在另一个问题上解决了您的 cmets,您的回答也没有考虑到完整的问题。 OP 说,“但是万一代码是 span class= “year something somethingelse” 它会在语法上改变一些东西吗?您的回答只考虑了第二种情况,但没有考虑第一种情况。像 SPAN 类这样的硬编码 XPath 将非常脆弱,因为它必须是 exact 文本匹配。相同的类名以不同的顺序或在类之间有额外的空格等都会导致 XPath 失败。
【解决方案3】:

这应该可以driver.find_elements_by_xpath("//div[@class='display_year']/span[@class='year']")

【讨论】:

    猜你喜欢
    • 2022-01-05
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 2019-12-10
    • 2022-07-13
    • 1970-01-01
    相关资源
    最近更新 更多