Перебрать ссылки в блоке
Помогите спарсить ссылки в цикле, не пойму как это реализовать делаю так :
users_url = []
for element in driver.find_elements(By.CLASS_NAME, 'tasks')[:20]:
users_url.append(driver.find_element(By.CLASS_NAME, 'row.taskblok').get_attribute('data-link'))
print(users_url)
Выдает только первый data-link и это логично. Если бы row taskblok были внутри других дивов, то можно было бы зацепиться и перебрать их внутри цикла, а так не пойму как мне это сделать.
Ответы (1 шт):
Похоже, что проблема связана с тем, как вы пытаетесь получить доступ к атрибуту data-link элемента row.taskbook. В вашем коде вы используете метод find_element для поиска элемента row.taskbook внутри переменной element, которая представляет каждый элемент с именем класса tasks.
Вместо этого вы должны использовать метод find_element для поиска элемента row.taskbook внутри переменной element, которая представляет каждый элемент task. Вы можете сделать это, связав методы find_element в цепочку, например:
users_url = []
for element in driver.find_elements(By.CLASS_NAME, 'tasks')[:20]:
users_url.append(element.find_element(By.CLASS_NAME, 'row.taskblok').get_attribute('data-link'))
print(users_url)
Этот код будет выполнять итерацию по первым 20 элементам task с именем класса tasks, и для каждого элемента он найдет внутри него элемент row.taskblok, а затем извлекет атрибут data-link этого элемента.
Я надеюсь, что это поможет!
UPD1:
Если код выводит только одну ссылку, возможно, что метод find_element неправильно находит элемент блока row.task. Вот несколько способов, которые вы можете попробовать для устранения проблемы:
Проверьте, действительно ли элементы
tasksсодержат элементы блокаrow.task. Вы можете сделать это, вручную проверив HTML-код или добавив инструкциюprintвнутри цикла, чтобы увидеть содержимое каждого элемента.Попробуйте использовать метод
find_elementsвместоfind_element. Методfind_elementsвозвращает список всех совпадающих элементов, поэтому вы можете выполнить цикл по списку и извлечь атрибутdata-linkдля каждого элементаrow.taskblok. Вот пример фрагмента кода:
users_url = []
for element in driver.find_elements(By.CLASS_NAME, 'tasks')[:20]:
rows = element.find_elements(By.CLASS_NAME, 'row.taskblok')
for row in rows:
users_url.append(row.get_attribute('data-link'))
print(users_url)
Этот код найдет все элементы блока row.task внутри первых 20 элементов tasks и добавит их атрибут data-link в список users_url.
- Убедитесь, что страница завершила загрузку, прежде чем запускать код. Вы можете добавить инструкцию
waitперед циклом, чтобы убедиться, что элементыtasksзагрузились. Например:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
# Wait for the page to load
wait = WebDriverWait(driver, 10)
tasks = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'tasks')))
# Extract links
users_url = []
for element in tasks[:20]:
users_url.append(element.find_element(By.CLASS_NAME, 'row.taskblok').get_attribute('data-link'))
print(users_url)
Этот код будет ждать до 10 секунд, пока элементы задач появятся на странице, прежде чем извлекать ссылки. Если элементы tasks не будут присутствовать через 10 секунд, код вызовет исключение TimeoutException.
