【问题标题】:How to access Span class or element in Selenium Python如何在 Selenium Python 中访问 Span 类或元素
【发布时间】:2021-09-15 04:12:11
【问题描述】:

您好,我正在尝试访问此元素跨度。我想以可以附加到列表的方式访问它。每个跨度都有一个 wordnr="1" 或任何数字。我希望每个wordnr 都进入列表。

这就是网站源代码的样子

<div id="row1" style="top: 1px;"><span wordnr="0" class="highlight">who</span> <span wordnr="1" class="">other</span> <span wordnr="2" class="">even</span> <span wordnr="3" class="">study</span> <span wordnr="4" class="">near</span> <span wordnr="5" class="">put</span> <span wordnr="6" class="">did</span> <span wordnr="7" class="">up</span> <span wordnr="8" class="">small</span> <span wordnr="9" class="">white</span> <span wordnr="10" class="">go</span> <span wordnr="11" class="">call</span> <span wordnr="12" class="">the</span> <span wordnr="13" class="">big</span> <span wordnr="14" class="">she</span> <span wordnr="15" class="">example</span> <span wordnr="16" class="">part</span> <span wordnr="17" class="">those</span> <span wordnr="18" class="">mean</span> <span wordnr="19" class="">plant</span> <span wordnr="20" class="">down</span> <span wordnr="21" class="">just</span> <span wordnr="22" class="">school</span> <span wordnr="23" class="">still</span> <span wordnr="24" class="">only</span> <span wordnr="25" class="">went</span> <span wordnr="26" class="">thing</span> <span wordnr="27" class="">soon</span> <span wordnr="28" class="">make</span> <span wordnr="29" class="">small</span> <span wordnr="30" class="">when</span> <span wordnr="31" class="">at</span> <span wordnr="32" class="">such</span> <span wordnr="33" class="">work</span> <span wordnr="34" class="">together</span> <span wordnr="35" class="">world</span> <span wordnr="36" class="">like</span> <span wordnr="37" class="">want</span> <span wordnr="38" class="">really</span> <span wordnr="39" class="">her</span> <span wordnr="40" class="">show</span> <span wordnr="41" class="">turn</span> <span wordnr="42" class="">such</span> <span wordnr="43" class="">over</span> <span wordnr="44" class="">hard</span> <span wordnr="45" class="">place</span>

这是我的代码,它没有意义,因为我不知道如何访问或找到它。我正在使用 Repl.it,所以看起来可能有点混乱。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options

list=[]

chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

driver = webdriver.Chrome(options=chrome_options)


driver.get("https://10fastfingers.com/typing-test/english")

words= driver.find_element_by_xpath("//span[@class='wordnr'/span[0]]").text

【问题讨论】:

    标签: python selenium selenium-webdriver web-scraping selenium-chromedriver


    【解决方案1】:

    看看这是否有效:-

    list = []
    words = driver.find_elements_by_xpath("//div[@id='row1']/span")
    for e in words:
        list.append(e.get_attribute("wordnr"))
    

    【讨论】:

      【解决方案2】:

      有一个接受all cookies 按钮。你必须点击它。下面是示例代码:

      代码:

      driver.maximize_window()
      driver.get("https://10fastfingers.com/typing-test/english")
      wait = WebDriverWait(driver, 10)
      wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a[id='CybotCookiebotDialogBodyLevelButtonLevelOptinAllowAll']"))).click()
      sleep(5)
      for name in driver.find_elements(By.XPATH, "//span[@wordnr]"):
          print(name.get_attribute('wordnr'))
      

      进口:

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

      【讨论】:

      • 这个答案也比公认的好,投给它。
      • 奇怪的是,OP 接受了可用答案中最差的答案。 OP 昨天有一个问题,这是非常令人困惑的东西 :)
      【解决方案3】:

      我认为以下应该可行。
      等到页面加载完毕,获取相关元素的列表,然后从每个元素中提取文本并将其附加到列表中

      from selenium import webdriver
      from selenium.webdriver.common.keys import Keys
      from selenium.webdriver.chrome.options import Options
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      import time
      
      chrome_options = Options()
      chrome_options.add_argument('--no-sandbox')
      chrome_options.add_argument('--disable-dev-shm-usage')
      
      driver = webdriver.Chrome(options=chrome_options)
      wait = WebDriverWait(driver, 20)
      
      driver.get("https://10fastfingers.com/typing-test/english")
      texts_list=[]
      #wait for first element presence
      wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "span[wordnr]")))
      #wait for the rest elements loaded
      time.sleep(1)
      
      elements = driver.find_elements_by_css_selector("span[wordnr]")
      for element in elements:
          texts_list.append(element.text)
      
      

      【讨论】:

      • 最好不要命名自定义列表list
      • 你是对的,谢谢!更新了变量名
      • 至少我会赞成你的答案,因为我不同意接受的答案。这种方法非常不稳定。
      • 我像往常一样同意你的看法:)
      【解决方案4】:

      1 有“接受cookies”按钮。在获取文本之前单击它。

      2 要获取文本,请使用item.get_attribute("innerHTML")。不知道为什么item.text 不适用于您的情况。稍后我会检查它,真的很有趣。

      3 Selenium 使用my_list = driver.find_elements_by_css_selector("#row1&gt;span[wordnr]") 为您创建一个列表,您不需要创建额外的列表并将值附加到它。此外,在您的情况下这样做可能会导致包含内部列表的列表。

      4 使用正确的显式等待。 visibility_of_all_elements_located 不起作用,因为文本仅部分可见。

      5 尽量不要使用list 这样的标识符。这可能是代码可读性的问题。在这里查看有趣的问题Better Python list Naming Other than "list"我的解决方案

      from selenium import webdriver
      from selenium.webdriver.chrome.options import Options
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      
      
      chrome_options = Options()
      chrome_options.add_argument('--no-sandbox')
      chrome_options.add_argument('--disable-dev-shm-usage')
      
      driver = webdriver.Chrome(executable_path='/snap/bin/chromium.chromedriver', options=chrome_options)
      
      
      driver.get("https://10fastfingers.com/typing-test/english")
      wait = WebDriverWait(driver, 20)
      
      #wait for first element presence
      wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#CybotCookiebotDialogBodyLevelButtonLevelOptinAllowallSelectionWrapper>#CybotCookiebotDialogBodyLevelButtonLevelOptinAllowAll"))).click()
      
      wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "span[wordnr]")))
      my_list = driver.find_elements_by_css_selector("#row1>span[wordnr]")
      print(len(my_list))
      for item in my_list:
          print(item.get_attribute("innerHTML"))
      

      样本输出

      385
      keep
      country
      been
      their
      food
      do
      ...
      

      打印整个列表(385 个字)。

      【讨论】:

        猜你喜欢
        • 2019-11-18
        • 1970-01-01
        • 2017-11-23
        • 2019-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多