Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
 Аватар для RSK14
1 / 1 / 0
Регистрация: 26.02.2020
Сообщений: 20

Центрировать экран на найденном тексте на странице

03.02.2021, 10:57. Показов 5366. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток всем, надеюсь, что легкий вопрос и не доставит трудностей, однако в интернете ответа по нему найти не смог.

Python selenium

Небольшой отрывок кода

Python
1
2
if "ТЕКСТ" in driver.page_source:
screenshot = driver.save_screenshot(f"ТЕКСТ{i}.png")
В данном случае, если текст находится на этой странице, то код делает скриншот этой страницы. Однако он делает скриншот не данного текста, а просто верхнего участка этой страницы.

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

Большое спасибо за любую предоставленную помощь!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.02.2021, 10:57
Ответы с готовыми решениями:

поиск в тексте и подсветка в найденном
Имеется самописный форум на ASP.NET, хочу прикрутить поиск по сообщениям, но нужно, чтобы в отображенных результатах слова поиска...

Как центрировать элемент на главной странице?
http://itmages.ru/image/view/4905521/8f855c2d Нужно центрировать три текстовых элемента. Их было пять раньше, два удалил - все съехало...

реклама в тексте и на главной странице
Всем добрый день Мой сайт http://ciferkom.ru 1. У меня на главной странице идет блог новостей, как сделать так что б например идёт 3...

26
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
03.02.2021, 11:03
RSK14, насколько помню есть возможность скрина конкретного элемента. То есть находим по тексту твой текст и скриним. Или скроллим так, чтобы он был в центре видимой части. Надеюсь, что легко и не доставит трудностей почитать документацию селениума.
1
 Аватар для RSK14
1 / 1 / 0
Регистрация: 26.02.2020
Сообщений: 20
03.02.2021, 11:08  [ТС]
Welemir1, большое спасибо, не подскажете где лучше всего данную информацию будет найти и прочитать?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
03.02.2021, 11:10
RSK14, конечно подскажу, надо погуглить 1 секнуду и перейти вот по этой ссылке, дальше читать ибо очень интересно
1
 Аватар для RSK14
1 / 1 / 0
Регистрация: 26.02.2020
Сообщений: 20
03.02.2021, 12:00  [ТС]
Спасибо, полазил там, вроде бы нашел один из вариантов решения, однако все равно возникла загвоздка некая

Python
1
2
3
4
if "ТЕКСТ" in driver.page_source:
element1 = driver.find_elements_by_xpath("//*[contains(text(), 'ТЕКСТ')]")
element1.location_once_scrolled_into_view
screenshot = driver.save_screenshot(f"ТЕКСТ{i}.png")
по идее должен скроллить до этого текста, однако этого не произошло, вообще всё встало просто

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

возможность скрина конкретного элемента не найдена в документации, что вы предоставили
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
03.02.2021, 12:08
Цитата Сообщение от RSK14 Посмотреть сообщение
возможность скрина конкретного элемента не найдена в документации, что вы предоставили
я тебе дал ссылку а ты еще это в вину ставишь? так значит плохо документацию читаешь, вернее не умеешь искать, что практически крест на карьере программиста.

итак сложнейшие действия - переходим по ссылке, в поиске на сайте вводим scrrenshot, кликаем 1 ссылку и читаем

screenshot_as_png
Gets the screenshot of the current element as a binary data.

Usage: element_png = element.screenshot_as_png
1
 Аватар для RSK14
1 / 1 / 0
Регистрация: 26.02.2020
Сообщений: 20
03.02.2021, 12:32  [ТС]
Welemir1, нет, нет, извините, ни коим образом не обвинял, просто сообщил про итоги, что меня постигли.
Да я и не программист собственно от слова совсем, так, порой пытаюсь что-то сварганить для облегчения повседневной рутины, порой выходит, порой нет.

Я собственно и искал по поиску текста, искал как screen, screenshot, скриншот (проблема моя быть может в том, что не владею английским хорошо, чтобы искать в оригинале и потому перевел страницу)

Если,я вас правильно понял, тогда должно сработать данным образом?

Python
1
2
3
if "ТЕКСТ" in driver.page_source:
element = driver.find_elements_by_xpath("//*[contains(text(), 'ТЕКСТ')]")
element_png = element.screenshot_as_png(f"НАЗВАНИЕ{i}.png")
Добавлено через 8 минут
Проблема главная на данном этапе по моему понимаю в том, что я не могу сделать обычный текст на странице элементом, то есть там можно по имени, по айди, классу и подобному, однако просто текст в документалке вроде как сделать элементом нельзя.

И получается, что все же надо либо как-то заставить экран листнуть на найденный текст, либо чтобы скриншот был именно выбранного текста, или же крайний вариант тогда делать просто скриншот всего окна, но придется потом в каждом изображении вновь же искать этот текст
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
03.02.2021, 12:38
Цитата Сообщение от RSK14 Посмотреть сообщение
тогда должно сработать данным образом?
нет
Цитата Сообщение от RSK14 Посмотреть сообщение
driver.find_elements_
найдет список элементов, а тебе нужен 1 конкретный. Используй метод без множественного числа

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

Цитата Сообщение от RSK14 Посмотреть сообщение
И получается, что все же надо либо как-то заставить экран листнуть
погоди листать, попробуй просто скринить элемент с текстом
1
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
03.02.2021, 12:51
пример
Python
1
2
3
4
5
6
7
8
9
10
11
>>> from selenium import webdriver
>>> d = webdriver.Chrome()
>>> d.get('https://ya.ru')
>>> element = d.find_element_by_xpath('//button[@type="submit"]')
>>> element
<selenium.webdriver.remote.webelement.WebElement (session="6ab3f225429aefd6be8e8262c91723a7", element="123a1f0a-25e4-4440-95c8-98c61856d214")>
>>> bytes_ = element.screenshot_as_png
>>> with open('find_logo.png', 'wb') as file:
...     file.write(bytes_)
...
1550
Название: find_logo.png
Просмотров: 63

Размер: 1.5 Кб
1
 Аватар для RSK14
1 / 1 / 0
Регистрация: 26.02.2020
Сообщений: 20
03.02.2021, 22:18  [ТС]
Большое спасибо, это действительно помогло, много помучался, однако я научился делать скриншот элементов, но появилась иная проблема.

Искомый объект находится в скролле, то бишь с экрана видно только одну двадцатую (примерно) часть текста, среди которого производится поиск. Я нашел все элементы по коду страницы, которые отвечают за эту область, были и дивы, и классы и айди, при нажатии на них выделялась вся та область, даже, которая прокручивается скроллом, но в результате скриншот получался не всего элемента, а только видимой части на экране.

По всей видимости значит таки придется искать текст, и чтобы экран его показывал, после чего только делать скриншот?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
03.02.2021, 23:02
Цитата Сообщение от RSK14 Посмотреть сообщение
По всей видимости значит таки придется искать текст, и чтобы экран его показывал, после чего только делать скриншот?
Найди минимально вложенный элемент, который вмещает в себя весь (или только нужный) текст: div, span или p.
Затем сделай скролл. Это можно сделать аж тремя способами - один тебе уже показывали.
Еще можно так:
Python
1
driver.execute_script('arguments[0].scrollIntoView(true);', найденный_элемент)
Или так:
Python
1
найденный_элемент.send_keys(Keys.END)

И дальше делай скриншот. Неужели не весь текст получается?
Тогда хотя бы покажи, что получается, чтобы люди могли понимать каков результат.
2
 Аватар для RSK14
1 / 1 / 0
Регистрация: 26.02.2020
Сообщений: 20
04.02.2021, 00:02  [ТС]
Вот прислал сам формат нужной страницы сайта. Это лишь обрывок полной версии страницы, прислал лишь нужный фрагмент. Есть тысячи вот таких страниц. Я через функцию прокручиваю по айди все эти страницы.

На некоторых из этих страниц, лишь на некоторых, где-то на одной из ста, есть необходимый текст, около пяти вариантов нужного текста.

Однако он может быть как в диве ZX (как на картинке), так и в диве FR, или любом другом возможном, всегда по разному.

То есть самый минимальный див это вот ZZ, ZX и так далее, однако на него нельзя опираться, так как он всегда находится в разном из этих дивов.

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

Сам код мой, который сейчас имеется и который хотелось бы улучшить, чтобы сократить кучу времени.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import time
 
def man():
driver = webdriver.Chrome()
driver.maximize_window()
time.sleep(1)
driver.get("https://site.ru")
btn_elem1 = driver.find_element_by_xpath("/html/body/div[2]/div[3]/div[2]/div[1]/div/div[1]/ul/li[2]/a")
btn_elem1.click()
btn_elem2 = driver.find_element_by_xpath("/html/body/div[2]/div[3]/div[2]/div[1]/div/div[1]/div[2]/div/p[1]/label/input")
btn_elem2.click()
btn_elem2.send_keys("login")
btn_elem3 = driver.find_element_by_xpath("/html/body/div[2]/div[3]/div[2]/div[1]/div/div[1]/div[2]/div/p[2]/label/input")
btn_elem3.click()
btn_elem3.send_keys("pass")
btn_elem4 = driver.find_element_by_xpath("/html/body/div[2]/div[3]/div[2]/div[1]/div/div[1]/div[2]/div/a")
btn_elem4.click()
time.sleep(3)
return driver
 
driver = man()
 
def automation_func(url, i):
driver.get(url)
if "BAD" in driver.page_source:
driver.get(url)
else:
btn_elem5 = driver.find_element_by_xpath("/html/body/div[1]/div[3]/div[1]/fieldset/div[2]/img[1]")
btn_elem5.click()
if "ПЕРВЫЙ НУЖНЫЙ ТЕКСТ" in driver.page_source:
screenshot = driver.save_screenshot(f"Пер{i}.png")
elif "ВТОРОЙ НУЖНЫЙ ТЕКСТ" in driver.page_source:
screenshot = driver.save_screenshot(f"Вто{i}.png")
elif "3 НУЖНЫЙ ТЕКСТ" in driver.page_source:
screenshot = driver.save_screenshot(f"Тре{i}.png")
elif "4 НУЖНЫЙ ТЕКСТ" in driver.page_source:
screenshot = driver.save_screenshot(f"Чет{i}.png")
elif "5 НУЖНЫЙ ТЕКСТ" in driver.page_source:
screenshot = driver.save_screenshot(f"Пят{i}.png")
elif "6 НУЖНЫЙ ТЕКСТ" in driver.page_source:
screenshot = driver.save_screenshot(f"Шес{i}.png")
elif "7 НУЖНЫЙ ТЕКСТ" in driver.page_source:
screenshot = driver.save_screenshot(f"Сед{i}.png")
elif "8 НУЖНЫЙ ТЕКСТ" in driver.page_source:
screenshot = driver.save_screenshot(f"Вос{i}.png")
driver.get(url)
 
 
def main():
for i in range(1, 100000):
if i in [4533, 54110]:
continue
automation_func(f"https://site.ru/ttttt/{i}", i)
 
if __name__ == "__main__":
main()

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

Я постарался, насколько мог, объяснить всю ситуацию)
Пробую вписать ваши коды в свою программу, но по большей степени код просто останавливается на той странице, где нужно сделать скриншот и все стопорится.
Миниатюры
Центрировать экран на найденном тексте на странице  
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
04.02.2021, 06:00
Цитата Сообщение от RSK14 Посмотреть сообщение
код просто останавливается на той странице, где нужно сделать скриншот и все стопорится.
возможно это вселенная подает какой-то сигнал. =)
например что тебе надо изучить очень много всего, начиная с осно верстки, до хпат(локаторы у тебя просто ужас) и основ селениума.
Без конкретики (вот страница, вот текст, не могу заскринить) помочь ничем не могу
0
 Аватар для RSK14
1 / 1 / 0
Регистрация: 26.02.2020
Сообщений: 20
04.02.2021, 09:26  [ТС]
Цитата Сообщение от Welemir1 Посмотреть сообщение
возможно это вселенная подает какой-то сигнал. =)
что надо еще потыкать наугад) рано или поздно получится, собственно помощи потому и спросил, чтобы получилось раньше, чем очень поздно)

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

Цитата Сообщение от Welemir1 Посмотреть сообщение
Без конкретики (вот страница, вот текст, не могу заскринить) помочь ничем не могу
мне показалось, что я как раз всё предоставил, для этого все и копировал сюда, чтобы полностью картину показать) в любом случае спасибо, хотя бы научился частично скринить элементы

единственная идея теперь написать огромный кодище на поиск искомого текста на каждый из сотни дивов и чтобы делал скрин, если там найдется текст, типо поиск в ZZ, потом в ZY, в ZX и так далее)
понимаю, что он огромный будет, но другого решения не вижу для себя пока что) сильно ли от этого будет задерживаться сам код, нужно ли дать ему паузы, чтобы он на каждой странице проверял сотни логических действий?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
04.02.2021, 09:56
набор слов. ничего не понимаю. Перебираем в цикле страницы, находим нужный нам текст(если он есть), скроллим к нему как показано выше и делаем скрин, берем следующую страницу. Все. Никакой лишнй логики, переборов, 3-этажного кода.
1
 Аватар для RSK14
1 / 1 / 0
Регистрация: 26.02.2020
Сообщений: 20
04.02.2021, 10:19  [ТС]
Цитата Сообщение от Welemir1 Посмотреть сообщение
скроллим к нему как показано выше
Так я ж пишу, что в этом и проблема. Я понял, что необходимо найти минимальный элемент, в который вложен данный текст div, span, p или еще чего.
Проблема в том, что минимальный элемент в котором находится искомый текст это див, который каждый раз рандомно разный, то есть на каждой из этих зациклированных страниц всегда есть сотни дивов, они даже называются min1, min2, min3 ... min100 и т.д. И в каком-то из них может быть есть текст.
А сами эти дивы вложены уже в бОльший див, который и так на экране, но не полностью, внутри этого дива и нужно скроллить получается)
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
04.02.2021, 10:20
Цитата Сообщение от RSK14 Посмотреть сообщение
Я понял, что необходимо найти минимальный элемент, в который вложен данный текст div, span, p или еще чего.
Проблема в том, что минимальный элемент в котором находится искомый текст это див, который каждый раз рандомно разный, то есть на каждой из этих зациклированных страниц всегда есть сотни дивов, они даже называются min1, min2, min3 ... min100 и т.д. И в каком-то из них может быть есть текст.
А сами эти дивы вложены уже в бОльший див, который и так на экране, но не полностью, внутри этого дива и нужно скроллить получается)
это все не имеет значения, просто xpath ищем нужный текст, он сам найдет тот самый элемент, нам не важна вложенность и сколько там дивов и дивы ли там вообще.
1
 Аватар для RSK14
1 / 1 / 0
Регистрация: 26.02.2020
Сообщений: 20
04.02.2021, 10:29  [ТС]
Цитата Сообщение от Welemir1 Посмотреть сообщение
пример

>>> from selenium import webdriver
>>> d = webdriver.Chrome()
>>> d.get('https://ya.ru')
>>> element = d.find_element_by_xpath('//button[@type="submit"]')
>>> element
<selenium.webdriver.remote.webelement.We bElement (session="6ab3f225429aefd6be8e8262c91723 a7", element="123a1f0a-25e4-4440-95c8-98c61856d214")>
>>> bytes_ = element.screenshot_as_png
>>> with open('find_logo.png', 'wb') as file:
...     file.write(bytes_)
...
1550
я правильно понимаю, что здесь расположен данный пример? Если да, то пойду еще раз попытаюсь добуквенно разобраться что к чему. спасибо еще раз
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
04.02.2021, 10:33
RSK14, здесь поиск по тегу и атрибуту тип, но можно и по тексту также найти.
1
 Аватар для RSK14
1 / 1 / 0
Регистрация: 26.02.2020
Сообщений: 20
04.02.2021, 10:47  [ТС]
element = driver.find_element_by_xpath("//*[contains(text(), 'ТЕКСТ')]")
верно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.02.2021, 10:47
Помогаю со студенческими работами здесь

Поиск в найденном
В поиске ворда есть такая замечательная возможность как &quot;найти в текущем фрагменте&quot;. Вот как подобное организовать с помощью кода VBA?...

Искать в найденном ЗУП 3.1
Доброго времени суток!!! Как это вывести? Не выходит жму ctrl+F.

Вывод сообщения об найденном объекте
Есть форма FormSearchCard в ней имеется поиск, поиск осуществляется путем запроса. Как сделать чтобы в окне message появлялось сообщение...

Открыть ссылку в первом найденном браузере
у меня есть скрипт на открытие ссылки в браузерах. On Error Resume Next Set WshShell =...

выход из программы при первом найденном i
#include&lt;stdio.h&gt; #include&lt;math.h&gt; #include&lt;conio.h&gt; void main() { float mas ={12.4821, 9.47979, 11.0158, 9.92554,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru