Прошу прощения за заголовок, который лучше описывает проблему, когда вы посещаете следующий веб-сайт:

Справа есть текст с надписью «Посмотреть все». Как только вы нажмете на нее, появится список ссылок на различные вилки. Я пытаюсь очистить гиперссылки для этих вилок.

Одна из проблем заключается в том, что скребок очищает не только ссылку для вилок, но и для профилей. Они не используют конкретный класс или идентификатор для этих ссылок. Итак, я отредактировал свой сценарий, чтобы вычислить, какой результат правильный, а какой нет. Эта часть работает. Однако скрипт очищает только несколько ссылок и не очищает другие. Это смутило меня, потому что сначала я подумал, что это вызвано тем, что элемент не виден селену из-за наличия прокрутки. Однако это не похоже на проблему, поскольку другие ссылки, которые не очищаются, обычно видны. Скрипт очищает только первые 5 ссылок и полностью пропускает остальные.

Сейчас я не уверен, что делать, поскольку нет ошибок или предупреждений о любой возможной проблеме с самим кодом.

Это короткая часть кода, который очищает ссылки.

driver.get(url)

wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, "button.see-all-forks"))).click()
fork_count = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, "span.jsx-3602798114"))).text
forks = wait.until(ec.presence_of_all_elements_located((By.CSS_SELECTOR, "a.jsx-2470659356")))
j = 1
for i, fork in enumerate(forks):
    if j == 1:
        forks[i] = fork.get_attribute("href")
        print(forks[i])
    if j == 3:
        j = 1
    else:
        j += 1

В этом случае переменная url - это ссылка, которую я предоставил выше. Затем цикл пропускает 3 результата после каждого, потому что каждый 4-й правильный. Я попытался использовать XPath для фильтрации результатов с помощью функции «содержит», однако имена меняются, поскольку пользователи называют их самостоятельно, так что, насколько я понимаю, это единственный способ отфильтровать результаты.

Это выход, который я получаю.

После этого результаты никогда не распечатываются, и программа завершается без ошибок. Что здесь происходит и что я пропустил? Меня смущает, почему Selenium очищает только пять результатов, после чего он прекращается.

Редактировать заметку - мой код объяснил:

Я установил операторы if для проверки каждого четвертого результата, так как он правильный, но и первый тоже правильный. Если «j! = 3», то прибавьте 1 к «j» один раз «j = 3» (теперь появляется результат), код, если «j = 1» запускается и печатается правильный результат. Таким образом, правильный результат всегда будет «j = 1».

1
541daw35d 2 Май 2021 в 23:44

1 ответ

Лучший ответ

Проблема здесь в том, что все ожидаемые условия, которые вы здесь используете, передаются после того, как представлен хотя бы один элемент.
Так

forks = wait.until(ec.presence_of_all_elements_located((By.CSS_SELECTOR, "a.jsx-2470659356")))

Улавливает не все элементы, как в буквальном смысле этого слова ... никогда не знаешь сколько, но хотя бы один.
Вот почему ваш список forks такой короткий.
Самый простой способ решить эту проблему - добавить жестко запрограммированный режим сна после wait.until(ec.presence_of_all_elements_located((By.CSS_SELECTOR, "a.jsx-2470659356"))) и только после этого получить список элементов.
Дополнительную информацию см. В этом сообщении.

В Java есть ожидаемое условие numberOfElementsToBeMoreThan, поэтому его можно использовать здесь с условием более 95 и т. Д., Но в Python список ожидаемых условий намного короче, и такой опции нет ....

1
Prophet 2 Май 2021 в 21:21