Как распечатать href/URL с помощью XPath?

#python #selenium #web-scraping #xpath

Вопрос:

Мой код переходит на веб-сайт, и на веб-сайте есть статья, которая содержит свою собственную ссылку/url/href.

Я хочу распечатать это поле.

Мой текущий код выделяет контейнер, в котором он находится, а затем я пытаюсь выполнить цикл for, чтобы получить href.

 from selenium import webdriver
driver = webdriver.Chrome()
import time

url = 'https://library.ehaweb.org/eha/#!*menu=6*browseby=8*sortby=2*media=3*ce_id=2035*label=21986*ot_id=25553*marker=1283*featured=17286'
driver.get(url)
time.sleep(3)
page_source = driver.page_source

container=driver.find_element_by_xpath("//div[@class='list-box col-md-6 col-lg-6 col-xl-4 test']")
for j in container:
    link= j.find_element_by_css_selector('a').get_attribute('href')
    print(link)
 

Комментарии:

1. Как называется эта статья?

Ответ №1:

Если я правильно понимаю, чего вы хотите, вам просто нужно распечатать дочерний (a) атрибут элемента:

 link = driver.find_element_by_xpath("//div[@class='list-box col-md-6 col-lg-6 col-xl-4 test']/a").get_attribute("href")
print(link)
 

Это печатает:

https://library.ehaweb.org/eha/2021/eha2021-virtual-congress/324511/hanny.al-samkari.pazopanib.for.severe.bleeding.and.transfusion-dependent.html?f=menu=6*browseby=8*sortby=2*media=3*ce_id=2035*label=21986*ot_id=25553*marker=1283*featured=17286

Если вы хотите использовать цикл, затем измените container=driver.find_element_by_xpath("//div[@class='list-box col-md-6 col-lg-6 col-xl-4 test']") его на

container=driver.find_elements_by_xpath("//div[@class='list-box col-md-6 col-lg-6 col-xl-4 test']")

Именно для этого элемента было бы достаточно следующего локатора:

 //div[contains(@class, 'test')]/a
 

Со следующим кодом:

 driver = webdriver.Chrome(executable_path='/snap/bin/chromium.chromedriver')
url = 'https://library.ehaweb.org/eha/#!*menu=6*browseby=8*sortby=2*media=3*ce_id=2035*label=21986*ot_id=25553*marker=1283*featured=17286'
driver.get(url)
driver.implicitly_wait(10)
container = driver.find_elements_by_xpath("//div[contains(@class, 'test')]")
for j in container:
    link = j.find_element_by_css_selector('a').get_attribute('href')
    print(link)
driver.close()
 

Комментарии:

1. не могли бы вы, пожалуйста, опубликовать выходные данные цикла for? я не уверен, использовали ли вы xpath для //div[содержит(@class, ‘test’)]/строку

2. library.ehaweb.org/eha/2021/eha2021-virtual-congress/324511/…

Ответ №2:

Эта страница содержит множество внутренних URL-адресов. Чтобы нажать на виртуальный контейнер EHA 2021, вы можете использовать приведенный ниже код.

 eha_2021 = driver.find_element_by_css_selector('div#listing-main a')
eha_2021_link = eha_2021_link.get_attribute('href')
print(eha_2021_link)
 

На всякий случай, если вы хотите нажать на COVID-19 Outbreak кнопку, вы можете попробовать приведенный ниже код.

Код :

 covid_19_element = driver.find_element(By.ID, 'menu-8')
covid_19_url = covid_19_element.get_attribute('href')
print(covid_19_url)
 

Предложение :

Старайтесь избегать такого xpath //div[@class='list-box col-md-6 col-lg-6 col-xl-4 test'] , это выглядит немного динамично и может измениться в зависимости от региона. Всегда используйте локатор в следующем порядке :

  1. ID
  2. Имя
  3. ТагНаме
  4. Имя класса
  5. Текст Ссылки
  6. Частичный Текст Ссылки
  7. Селектор CSS
  8. XPATH

Узнайте о них здесь

Ответ №3:

Это помогает мне получить href

 elems = driver.find_elements_by_xpath("//a[@href]")
for elem in elems:
    print(elem.get_attribute("href"))
 

Пройдите по списку, возьмите каждый элемент и извлеките из него требуемое значение атрибута (в данном случае href).

Комментарии:

1. Как это может помочь? Оператору не нужен текущий URL-адрес, ему нужен URL-адрес статьи, содержащейся на веб-сайте

2. Первоначальный ответ был совершенно другим. Теперь это просто слегка измененная версия моего ответа.