С помощью селена в питоне я хочу собрать данные о пользователе по имени «Грэм» на веб-сайте ниже: https://github.com/GrahamDumpleton/wrapt/graphs/contributors
Следуя предыдущему вопросу, я нашел заголовок, включающий имя «Грэм», найдя XPath:
driver.find_elements(By.XPATH, "//h3[contains(@class,'border-bottom')][contains(.,'Graham')]")
Как мне найти элемент под этим расположенным заголовком?
XPath:
//*[@id = "contributors"]/ol/li/span/h3/span[2]/span/div/a
Спасибо.
Искомый элемент может быть однозначно расположен по следующему XPath: //a[contains(.,'commit')]
.
Итак, если вы хотите напрямую найти все суммы фиксаций пользователей на странице, это можно сделать следующим образом:
commits = driver.find_elements(By.XPATH, "//a[contains(.,'commit')]")
for commit in commits:
print(commit.text)
И если вы хотите найти количество коммитов для конкретного пользователя, когда вы уже нашли блок пользователя или элемент заголовка, как мы делали в предыдущем вопросе, это можно сделать следующим образом:
header = driver.find_elements(By.XPATH, "//h3[contains(@class,'border-bottom')][contains(.,'Graham')]")
commit = header.find_element(By.XPATH, ".//a[contains(.,'commit')]")
print(commit.text)
Обращать внимание.
header.find_element(By.XPATH, ".//a[contains(.,'commit')]")
мы применили find_element
метод к header
объекту веб-элемента, а не к driver
объекту..
в начале XPath, чтобы начать поиск с текущего узла (header
), а не с начала всего DOM.UPD
добавление можно найти с помощью этого XPath: //span[@class='cmeta']//span[contains(.,'++')]
и удаление с //span[@class='cmeta']//span[contains(.,'--')]
Большое спасибо, @Prophet. Оно работает. Но он предоставляет такую информацию: 495 коммитов 31 627 ++ 9 898 -- Мой код: дополнение = header.find_element(By.XPATH, ".//span[contains(@class,'cmeta')][contains(., '++')]"). Как мне улучшить код, чтобы он отображал только добавление?
Это невозможно сделать с селеном, так как вы получаете содержимое этого элемента. Теперь вы можете заменить ++
и --
пустой строкой и обрезать пробелы до и после текста.
Выражение Xpath (//*[@class = "border-bottom p-2 lh-condensed"])[1]
выберет индивидуальный профиль
Пример:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
import time
webdriver_service = Service("./chromedriver") #Your chromedriver path
driver = webdriver.Chrome(service=webdriver_service)
driver.get('https://github.com/GrahamDumpleton/wrapt/graphs/contributors')
driver.maximize_window()
time.sleep(5)
n = driver.find_element(By.XPATH,'(//*[@class = "border-bottom p-2 lh-condensed"])[1]')
name= n.find_element(By.XPATH, './/a[@class = "text-normal"]').text
print(name)
Выход:
GrahamDumpleton
Большое спасибо! @Пророк. Я также хочу собрать число добавления и удаления Грэма. Итак, я пытаюсь: добавление = header.find_element(By.XPATH, ".//a[содержит(.,'++')]"); удаление = header.find_element(By.XPATH, ".//a[содержит(.,' --')]"), но не может найти ни одного элемента. Не могли бы вы помочь мне понять, где может быть проблема? Еще раз спасибо! Xpath добавления и удаления: //*[@id = "contributors"]/ol/li/span/h3/span[2]/span/div/span[1]; //*[@id = "contributors"]/ol/li/span/h3/span[2]/span/div/span[2]