В приведенном ниже HTML моя цель - вернуть zzde7e35d-8d9d-4763-95d2-9198684abb12
<div class = container>
<a class = "Blue-Button" data-type = "patch" data-disable-with = "Waiting" href = "/market/opening/zzde7e35d-8d9d-4763-95d2-9198684abb12">Yes</a>
</div>
Проблема в том, что я даже не могу найти URL-адрес внутри div
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
link = example.url
driver.get(link)
URL = driver.find_element_by_xpath('//a[contains(@href,"market")]')
print(URL)
Распечатывая приведенное выше, я, кажется, получаю кучу случайных символов, вообще не связанных с HTML, не говоря уже о рассматриваемом URL-адресе.
Если это упростит проблему, количество возвращаемых символов всегда будет одинаковой длины, легко ли обойти индексирование?
Если вы хотите получить href
, вам нужно использовать get_attribute('href')
это даст вам /market/opening/zzde7e35d-8d9d-4763-95d2-9198684abb12
, а затем split() это, и вы получите последний элемент.
link = example.url
driver.get(link)
URL = driver.find_element_by_xpath('//a[contains(@href,"market")]')
print(URL.get_attribute('href').split("/")[-1])
Выход:
zzde7e35d-8d9d-4763-95d2-9198684abb12
Возможно, вы пропустили задержку.
Вместо
URL = driver.find_element_by_xpath('//a[contains(@href,"market")]')
Попробуйте использовать
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
URL = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, '//a[contains(@href,"market")]'))).get_attribute("href")
print(URL)
Также вам нужно будет извлечь значение атрибута href
из возвращаемого объекта веб-элемента, как показано в коде.
Если это все еще не сработало, проверьте, находится ли элемент, к которому вы пытаетесь получить доступ, внутри iframe и т. д. Или, может быть, локатор не уникален и т. д.
Чтобы напечатать частичное значение атрибута href, т. е. zzde7e35d-8d9d-4763-95d2-9198684abb12
, вам нужно вызвать WebDriverWait для видимость_of_element_located(), и вы можете использовать любой из следующих стратегии поиска:
Используя LINK_TEXT:
print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.LINK_TEXT, "Yes"))).get_attribute("href").split("/")[3])
Используя CSS_SELECTOR:
print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "a.Blue-Button[data-type='patch'][data-disable-with='Waiting'][href*='market']"))).get_attribute("href").split("/")[3])
Используя XPATH:
print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//a[@class='Blue-Button' and @data-type='patch'][@data-disable-with='Waiting' and contains(@href, 'market')]"))).get_attribute("href").split("/")[-1])
Примечание: Вы должны добавить следующие импорты:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
You can find a relevant detailed discussion in Find div aria label starting with certain text and then extract