#python #selenium #selenium-webdriver #web-scraping #pycharm
#python #selenium #selenium-webdriver #очистка веб-страниц #pycharm
Вопрос:
Я пытаюсь автоматизировать некоторую очистку веб-страниц и собрал скрипт python с использованием selenium webdriver. Я успешно реализовал неявные и явные ожидания ранее в скрипте.
Во время отладки в PyCharm я могу видеть все атрибуты / значения каждого объекта thumbnail (WebElement), как и ожидалось, включая текст. Но тогда текстовое поле пусто БОЛЬШУЮ часть времени, когда я пытаюсь получить к нему доступ в скрипте. Я перепробовал все виды условий ожидания в классе EC.
try:
# wait 30 seconds before looking for element
WebDriverWait(driver, 30).until(
EC.presence_of_all_elements_located((By.CLASS_NAME, 'thumbnail'))
)
except:
# else quit
driver.quit()
quit(1)
thumbnails = driver.find_elements_by_class_name('thumbnail')
for thumbnail in thumbnails:
try:
# wait 30 seconds before looking for element
WebDriverWait(driver, 30).until(len(thumbnail.text) != 0)
except:
# else quit
driver.quit()
quit(1)
time = thumbnail.text
h, m = time.strip().split(':')
url = thumbnail.find_element_by_tag_name('img').get_attribute('src')
urllib.request.urlretrieve(url, 'slides/' h '_' m '.jpg')
Поскольку иногда я получаю ожидаемое поведение в скрипте, я должен предположить, что здесь происходит какое-то странное состояние гонки каждый раз, когда я запрашиваю что-либо. Я просто не знаю, что это может быть. Моя следующая мысль — захватить HTML в виде строки через driver.pagesource и использовать LXML для его анализа, но, очевидно, это обходной путь.
Почему я всегда могу видеть значения в моем отладчике и как такое поведение может быть возможным? Кроме того, в последней попытке / except предложение except выполняется задолго до 30 секунд…
Редактировать: я прикрепил соответствующий HTML
<!-- Thumbnail template -->
<script id="thumbnailTemplate" type="text/template">
<@ _.each(thumbnails, function (thumbnail) { @>
<li id="<@= thumbnail.id @>"
class="thumbnail"
tabindex="0"
role="button"
aria-label="<@= Panopto.GlobalResources.Viewer_Aria_JumpToTimestamp.format(thumbnail.timestamp)@>"
style="display:none;">
<div class="thumbnail-highlight accent-background safety-accent-border"
aria-label="Jump to {0}"></div>
<img data-src="<@= thumbnail.src @>" aria-hidden="true" />
<div class="thumbnail-timestamp"
aria-label="<@= thumbnail.text ? thumbnail.text : Panopto.GlobalResources.Viewer_Aria_HideThumbnailTimeFormat.format(thumbnail.timestamp)@>"
><@= thumbnail.timestamp @></div>
<@ if (thumbnail.editable) { @>
<div class="thumbnail-buttons" style="display:none;">
<i class="thumbnail-edit material-icons" tabindex="0" title="Edit">amp;#xE150;</i><!-- whitespace
--><i class="thumbnail-delete material-icons" tabindex="0" title="Delete">amp;#xE872;</i>
</div>
<@ } @>
</li>
<@ }); @>
</script>
<ol id="thumbnailList" class="thumbnail-strip" aria-label="Preview image list" style="width: 480px;">
<li id="thumbnail9thumbnailList" class="thumbnail highlighted" tabindex="0" role="button" aria-label="Jump to 0:00" style="display: none;" aria-current="true">
<div class="thumbnail-highlight accent-background safety-accent-border" aria-label="Jump to {0}"></div>
<img data-src="https://pitt.hosted.panopto.com/Panopto/Pages/Viewer/Thumb.aspx?eventTargetPID=db184992-2dd3-4257-aa24-ac10003dcc84amp;amp;sessionPID=70dd3b7a-2b76-40ce-98ea-ac10003dccf6amp;amp;number=20774958amp;amp;isPrimary=falseamp;amp;absoluteTime=13241245519.395262" aria-hidden="true" src="https://pitt.hosted.panopto.com/Panopto/Pages/Viewer/Thumb.aspx?eventTargetPID=db184992-2dd3-4257-aa24-ac10003dcc84amp;amp;sessionPID=70dd3b7a-2b76-40ce-98ea-ac10003dccf6amp;amp;number=20774958amp;amp;isPrimary=falseamp;amp;absoluteTime=13241245519.395262">
<div class="thumbnail-timestamp" aria-label="Preview image at 0:00">0:00</div>
</li>
Комментарии:
1. Я не могу предоставить точное решение, поскольку вы не предоставили общий доступ к HTML DOM или ссылке на страницу. Однако есть пара предложений, например, на вашей странице динамически загружается javascript, например, как только вы куда-то перемещаете курсор, тогда загружается только текст страницы. Также ваш комментарий немного отличается от явного wit в первой строке. Он не будет ждать 30 секунд, прежде чем начать поиск элементов, а не будет искать до 30 секунд, чтобы элементы появились. Возможно, ваш элемент находится, но текст не отображается полностью. Пожалуйста, поделитесь ссылкой на страницу / HTML для дополнительной отладки.
2. @rahulrai спасибо за ваш ответ, я добавил соответствующий HTML … как вы можете видеть, что определенно задействованы некоторые сценарии, но почему cant / как webdriver может извлекать непосредственно из источника страницы? (Я после временных меток)
3. Тем не менее, я не могу полностью воспроизвести / понять вашу проблему. Но я вижу элемент с миниатюрой i внутри тега script. Поэтому для получения текста вы должны использовать thumbnail.get_attribute («innerHTML») , а не thumbnail.text.