使用Selenium/XPath/Python抓取文本

使用Selenium/XPath/Python抓取文本,python,selenium,svg,xpath,webdriverwait,Python,Selenium,Svg,Xpath,Webdriverwait,我想计算一下这次事故的死亡人数。我想使用Selenium、Python和Selenium的chrome驱动程序来实现这一点。死亡人数可在路径/*[@id=“ember1915”]/svg/g[2]/svg/text下找到 这是我的剧本: from selenium.webdriver import Chrome from selenium import webdriver from selenium.webdriver.common.keys import Keys with Chrome(

我想计算一下这次事故的死亡人数。我想使用Selenium、Python和Selenium的chrome驱动程序来实现这一点。死亡人数可在路径
/*[@id=“ember1915”]/svg/g[2]/svg/text
下找到

这是我的剧本:

from selenium.webdriver import Chrome
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

with Chrome() as driver:
    driver.get('https://coronavirus.jhu.edu/map.html')
    driver.implicitly_wait(20) # Waits for 20 s for the entire page to loads.
    

    diplayElement = driver.find_element_by_xpath('//*[@id="ember1915"]/svg/g[2]/svg/text')
它失败,错误为“无此类元素:

Unable to locate element: {"method":"xpath","selector":"//*[@id="ember1915"]/svg/g[2]/svg/text"}”.
这种情况也发生在其他我正在努力抓取的网站上


如何修复此问题?此错误的原因是什么?

来自的总死亡人数(即905181的元素在
范围内,因此您必须:

  • 使所需帧可用并切换到该帧

  • 针对位于()的元素的可见性进行归纳,您可以使用以下任一选项:

    • 使用
      XPATH
      get\u attribute()

    • 使用
      XPATH
      和文本属性:

      driver.get('https://coronavirus.jhu.edu/map.html')
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@title='Coronavirus COVID-19 Global Cases by Johns Hopkins CSSE']")))
      print(WebDriverWait(driver, 60).until(EC.visibility_of_element_located((By.XPATH, "//*[name()='svg']/*[name()='text' and text()='Global Deaths']//following::div[1]/*[name()='svg']//*[name()='g']/*[name()='svg']/*[name()='text']"))).text)
      
  • 控制台输出:

    905,181
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
您可以在中找到相关的讨论


参考文献 您可以在以下内容中找到一些相关讨论:


您如何确定它在不选择iframe的情况下返回文本或内部html?我想知道,即使不选择shadow元素,它将如何执行此操作。@Dev Nice catch,在复制代码时滑出,现在已更正。
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC