Код для поиска шаблона, в котором за фиксированной строкой следует любое положительное целое число, за которым следует другая фиксированная строка - PullRequest
0 голосов
/ 28 октября 2019

Я перемещаюсь по динамической веб-странице с помощью Selenium. Страница загружает контент динамически в зависимости от того, по какой ссылке нажимает пользователь, не влияя на адрес веб-страницы. Например, ниже приведен исходный код HTML по одной из ссылок:

enter image description here

Как видно, событие JS onclick для этого конкретного местоположенияэто openLocation(L_52). Для другой ссылки это может быть openLocation(L_73) и т. Д. Я могу смоделировать щелчок по этой ссылке со следующей строкой кода:

location = driver.execute_script("openLocation('L_52')")

Я пытаюсь перейти по каждой из этих ссылок. Проблема в том, что эти события JS onclick не в последовательном порядке;они имеют вид openLocation(L_x), где x может быть любым случайным положительным целым числом.

Таким образом, я не мог написать цикл for, такой как следующий, для последовательной навигации по всем из них:

for k in range(num_locations):
    location = driver.execute_script("openLocation('L_{}')".format(str(k)))

Это приводит к тому, что некоторые местоположения пропускаются всякий раз, когда местоположение n+1 отсутствует после местоположения n.

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

loc_nums = [52, 53, 54, 55, 101, 56, 6, 7, 41, 57, 58]
for l in loc_nums:
    location = driver.execute_script("openLocation('L_{}')".format(str(l)))

Но, очевидно, этот подход не является устойчивым, если число ссылок велико,Итак, я хочу знать, есть ли способ запустить какое-либо событие JS onclick, которое имеет строку openLocation('L_, за которой следует любое положительное целое число, за которым следует строка ').

PS: Я знаю, как сопоставить шаблон в заданной строке с регулярными выражениями:

import re
re.findall(r"openLocation\('L_[0-9]+'\)", "openLocation('L_52')")

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

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

Вы можете найти все элементы, соответствующие шаблону, в onclick и извлечь из них числа

data = driver.find_elements_by_css_selector('[onclick^="openLocation("L_"][onclick$=")"]')
loc_nums = [re.search(r'\d+', x).group() for x in data]

Если ссылки открываются в новой вкладке / окне, а элементы в dataВы можете пропустить шаг извлечения чисел

[driver.execute_script(x.get_attribute('onclick')) for x in data]
0 голосов
/ 28 октября 2019

Смотрите в разделе '4.3. Поиск по XPath ':

https://selenium -python.readthedocs.io / locating-elements.html

Вот практический пример изкак это сделать, адаптировать и встроить в ваш вариант использования. Вы можете использовать его для определения точного имени, а затем передать его вашему execute_script

...