如何访问 Span class 或 Selenium Python 中的元素
How to access Span class or element in Selenium Python
您好,我正在尝试访问此元素跨度。我想以一种可以附加到列表的方式访问它。每个跨度都有一个 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
看看这是否有效:-
list = []
words = driver.find_elements_by_xpath("//div[@id='row1']/span")
for e in words:
list.append(e.get_attribute("wordnr"))
有一个接受 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
我认为以下应该可行。
等到页面加载完毕,获取相关元素的列表,然后从每个元素中提取文本并将其附加到列表中
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)
1 有“接受cookies”按钮。在获取文本之前单击它。
2 要获取文本,请使用 item.get_attribute("innerHTML")
。不确定为什么 item.text
不适用于您的情况。待会儿再看看,真有趣
3 Selenium 使用 my_list = driver.find_elements_by_css_selector("#row1>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 个单词)。
您好,我正在尝试访问此元素跨度。我想以一种可以附加到列表的方式访问它。每个跨度都有一个 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
看看这是否有效:-
list = []
words = driver.find_elements_by_xpath("//div[@id='row1']/span")
for e in words:
list.append(e.get_attribute("wordnr"))
有一个接受 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
我认为以下应该可行。
等到页面加载完毕,获取相关元素的列表,然后从每个元素中提取文本并将其附加到列表中
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)
1 有“接受cookies”按钮。在获取文本之前单击它。
2 要获取文本,请使用 item.get_attribute("innerHTML")
。不确定为什么 item.text
不适用于您的情况。待会儿再看看,真有趣
3 Selenium 使用 my_list = driver.find_elements_by_css_selector("#row1>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 个单词)。