Selenium Python - 从 Class 中提取文本

Selenium Python - Extract Text from Class

我正在尝试从下图中的第二个“深层”class 中提取文本。在这种情况下,它将是单词“Sauvage”

The Elements

我做了以下事情:

search_perfumes = driver.find_elements(By.XPATH,'//span[@class="deep"][1]')
for perfumes in search_perfumes:
    list_perfumes.append(perfumes.text)

列表的长度正确显示了 23 个元素(这是正确的,因为页面有 23 种香水),但列表有 23 个空元素。我似乎无法提取“深”class.

之后的文本

知道我可能哪里出错了吗?

您正在尝试从匹配 //span[@class="deep"] XPath 的第二个 web 元素 中提取文本。
您可能错过了等待,试图在元素完全加载之前提取文本。我不确定,因为您没有共享所有代码。
请试试这个:

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

wait = WebDriverWait(driver, 20)

wait.until(EC.visibility_of_element_located((By.XPATH, '//span[@class="deep"][2]')))
search_perfumes = driver.find_elements(By.XPATH,'//span[@class="deep"][2]')
for perfumes in search_perfumes:
    list_perfumes.append(perfumes.text)

根据您分享的Html,您可以使用 XPath 索引:

(//span[@class='deep'])[2] 

在代码中:

print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "(//span[@class='deep'])[2]"))).text)

进口:

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

现在你必须确保[2]在整个HTML中代表Sauvage。您可以将指数[2]增加或减少到任何其他匹配数字。

你会怎么做? - 你需要确保我们在HTMLDOM中有一个唯一的匹配节点。更详细的解释请看下面:

如果我们在 HTML DOM 中有 unique 条目,请检查 dev tools (Google chrome)。

检查步骤:

Press F12 in Chrome -> 转到 element 部分 -> 执行 CTRL + F -> 然后粘贴 xpath 并查看是否需要 element正在 突出显示 1/1 匹配节点。

此外,您可以使用此 xpath //span[@class='deep']

获得 Web 元素列表
for ele in driver.find_elements(By.XPATH, "//span[@class='deep']"):
    print(ele.text)

更新:

您必须先单击 Accept all cookie 按钮,该按钮位于 shadow root:

代码:

driver = webdriver.Chrome(driver_path)

driver.maximize_window()
wait = WebDriverWait(driver, 30)

driver.get("https://www.parfumdreams.pt/?m=5&search=sauvage")

try:
    time.sleep(2)
    cookie_btn = driver.execute_script('return document.querySelector("#usercentrics-root").shadowRoot.querySelector("#uc-center-container > div.sc-jJoQJp.dTzACB > div > div > div > button")')
    cookie_btn.click()
    print('Clicked')
except:
    print('Could not click')
    pass


print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "(//span[@class='deep'])[2]"))).text)

或者如果你想要所有这些,而不是上面的打印命令,使用下面的代码:

for ele in driver.find_elements(By.XPATH, "//span[@class='deep']"):
    driver.execute_script("arguments[0].scrollIntoView(true);", ele)
    print(ele.text)

输出:

DIOR
Sauvage
DIOR
Sauvage
DIOR
Sauvage
DIOR
Sauvage
DIOR
Sauvage
DIOR
Sauvage
DIOR
Sauvage
DIOR
Eau Sauvage
DIOR
Eau Sauvage
DIOR
Eau Sauvage
DIOR
Eau Sauvage
DIOR
Eau Sauvage
DIOR
Eau Sauvage
DIOR
Eau Sauvage
DIOR
Eau Sauvage
DIOR
Eau Sauvage
DIOR
Eau Sauvage
DIOR
Eau Sauvage
Creed
Neroli Sauvage
DIOR
Eau Sauvage
DIOR
Lápis de lábios
DIOR
Lápis de lábios
Estée Lauder
Maquilhagem para lábios