Извлечь частичный текст из ссылки на элемент с помощью python/selenium

В приведенном ниже 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-адресе.

Если это упростит проблему, количество возвращаемых символов всегда будет одинаковой длины, легко ли обойти индексирование?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
45
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Если вы хотите получить 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

Другие вопросы по теме