如何使用 Selenium 和 Python 查找从 covid 中恢复的人数的类路径

Posted

技术标签:

【中文标题】如何使用 Selenium 和 Python 查找从 covid 中恢复的人数的类路径【英文标题】:How to find the class path for the number of recovered people from covid using Selenium and Python 【发布时间】:2021-03-29 01:30:51 【问题描述】:

所以,我需要从这个网页获取文本(从 covid 中恢复的人数)到控制台,但是我找不到数字的类,有人可以帮我找到类,所以我可以打印数字进入控制台。我需要使用 PhantomJS 因为我不想在运行代码时打开日志。

from selenium import webdriver


driver = webdriver.PhantomJS()
driver.get('https://www.tvnet.lv/covid19Live')

text = driver.find_element_by_class_name("covid-summary__count covid-c-recovered")
print(text)

【问题讨论】:

【参考方案1】:

根据selenium.webdriver.common.by 实现的文档:

class selenium.webdriver.common.by.By
    Set of supported locator strategies.

    CLASS_NAME = 'class name'
    

因此,使用 find_element_by_class_name() 您将无法传递多个类名,因为它接受一个类。


解决方案

要打印HEALED的人数,您可以使用以下任一Locator Strategies:

拉特维耶

print(driver.find_element_by_xpath("//h1[contains(., 'COVID-19 LATVIJĀ')]//following::ul[1]//p[@class='covid-summary__count covid-c-recovered']").text)

帕索

print(driver.find_element_by_xpath("//h1[contains(., 'COVID-19 PASAULĒ')]//following::ul[1]//p[@class='covid-summary__count covid-c-recovered']").text)

理想情况下,您需要为visibility_of_element_located() 诱导WebDriverWait,您可以使用以下任一Locator Strategies:

拉特维耶

driver.get("https://www.tvnet.lv/covid19Live")
print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//h1[contains(., 'COVID-19 LATVIJĀ')]//following::ul[1]//p[@class='covid-summary__count covid-c-recovered']"))).text)

帕索

driver.get("https://www.tvnet.lv/covid19Live")
print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//h1[contains(., 'COVID-19 PASAULĒ')]//following::ul[1]//p[@class='covid-summary__count covid-c-recovered']"))).text)

注意:您必须添加以下导入:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

控制台输出:

19 072
52 546 925

您可以在How to retrieve the text of a WebElement using Selenium - Python找到相关讨论


参考文献

您可以在以下位置找到一些相关的详细讨论:

Invalid selector: Compound class names not permitted error using Selenium How to locate an element with multiple class names?

【讨论】:

它仍然给我同样的错误(selenium.common.exceptions.TimeoutException: Message: Screenshot: available via screen) 它给了我一个错误:(selenium.common.exceptions.TimeoutException: Message: Screenshot: available via screen) @Lagis_YTYT 有一个小错误,已更正。请重新测试。【参考方案2】:

find_element_by_class_name() 需要一个 单个类 作为参数,但您提供了两个类名(类是一个 “多值属性”,多个值由一个空格)。

检查单个类:

driver.find_element_by_class_name("covid-c-recovered")

或者,切换到 CSS 选择器:

driver.find_element_by_css_selector(".covid-summary__count.covid-c-recovered")

深入挖掘

让我们看看source code。当通过类名搜索元素时,Python selenium 实际上在底层构造了一个 CSS 选择器:

elif by == By.CLASS_NAME:
    by = By.CSS_SELECTOR
    value = ".%s" % value

这意味着当您使用 covid-summary__count covid-c-recovered 作为类名值时,用于查找元素的实际 CSS 选择器恰好是:

.covid-summary__count covid-c-recovered

可以理解的是它不匹配任何元素(covid-c-recovered 将被视为此处的标签名称)。

【讨论】:

它给了我一个错误:屏幕截图:可通过屏幕获得【参考方案3】:

如果你想要数字,请确保类名之间有圆点。

driver.get('https://www.tvnet.lv/covid19Live')
element = driver.find_element_by_class_name("covid-summary__count.covid-c-recovered")
print(element.text)

输出

19 072

【讨论】:

它给了我一个错误:屏幕截图:可通过屏幕获得

以上是关于如何使用 Selenium 和 Python 查找从 covid 中恢复的人数的类路径的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Selenium 和 Python 查找从 covid 中恢复的人数的类路径

Selenium web 自动化使用 python:如何使用 selenium 处理表以通过匹配文本来查找特定行并删除该行

如何使用python在selenium中通过其id名称的一部分查找元素

如何使用 selenium python 查找包含特定字符串的所有按钮?

使用 Selenium 和 Python 和 Safari 查找 CVV

按值查找元素 Selenium/Python