Форум программистов, компьютерный форум, киберфорум
Python: Web
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1

Как различать таблицы с Селениумом?

12.02.2019, 05:57. Показов 1579. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть две таблицы. У них есть общий родительский блок (div_nav). Но эти таблицы имеют разную структуру. У них разные css селекторы. Пытаюсь получить к ним доступ в одной функции. Если пробую через try/except - обе таблицы заходят в try. Если пробую через if/else - обе таблицы заходят в else. Подскажите, что не так.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
div_nav = driver.find_element_by_css_selector("#odds-data-table")
try:
        rows = div_nav.find_elements_by_css_selector('span.odds-co')
        print(1)
except:
        rows = div_nav.find_elements_by_css_selector('tr.lo')
        print(2)
#1, 1
 
if div_nav.find_elements_by_css_selector('span.odds-co'):
        print(1)
else:
        print(2)
#2, 2
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.02.2019, 05:57
Ответы с готовыми решениями:

Подскажите как найти селениумом строку поиска и отправить в нее текст
У меня чет не получается ее найти. Экспериментирую с сайтом www.dzen.ru Ищу этой строчкой:...

Как селениумом пройтись по опциям товара? (select.select_by_visible_text выдает ошибку после первого цвета)
При клике на опцию цвета, меняется цена. сейчас скрипт переключает цвет 1 раз и выдает ошибку: Как это исправить? # utf-8...

Как различать Session переменые?
Такая вот задачка. 1) пользователь №1 логинится под своим логином и получает список репортов и в это же время создаётся Session...

22
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
12.02.2019, 05:59  [ТС]

0
151 / 86 / 35
Регистрация: 05.08.2017
Сообщений: 257
12.02.2019, 08:46
m0nte-cr1st0, Как вариант - брать последний span
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
12.02.2019, 08:51
m0nte-cr1st0, как вариант, брать все, складывать в список списков или кортеж =)
потом выдирать нужное =)
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
12.02.2019, 12:09  [ТС]
Resistanse, типа по селектору он не находит?.
и почему try/ecept и if/else ведут себя по-разному.

IRIP, мне кажется, когда у тебя тысячи страниц, это не самое оптимальное решение.
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
12.02.2019, 13:53
m0nte-cr1st0, до 50 000 страниц, вполне рабочий вариант
только не в память уже складывать надо, а в sqlite
0
14 / 8 / 7
Регистрация: 09.01.2018
Сообщений: 151
12.02.2019, 14:41
С помощью Xpath кинь ссылку , прикину вариант от себя.
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
12.02.2019, 14:45  [ТС]
Mep3avec, да вот.
https://www.oddsportal.com/soc... -dWi6gO5P/
возьми, к примеру, эту таблицу.
и сравни её с этой
https://www.oddsportal.com/soc... gO5P/#ah;2

Добавлено через 1 минуту
IRIP, там как-раз если брать все таблицы, то порядка 80 000 будет
0
14 / 8 / 7
Регистрация: 09.01.2018
Сообщений: 151
12.02.2019, 15:04
Цитата Сообщение от m0nte-cr1st0 Посмотреть сообщение
и сравни её с этой
В смысле сравни ты завесь топик не назвал условия по которому сравнивать.
Я предполагаю тебе нужно условие при котором будет находить обе таблицы , но...

PHP
1
2
3
4
browser = webdriver.Firefox()
    browser.get('https://www.oddsportal.com/soccer/england/premier-league/tottenham-newcastle-utd-dWi6gO5P/#ah;2')
    browser.implicitly_wait(3)
    point = browser.find_elements_by_xpath('//*[@id="odds-data-table"]')
PHP
1
find_elements_by_xpath
должен находить все элементы подходящие под условия , но поскольку находит ток 1 таблицу (не забываем про ul[@class='ul-nav']), поэтому лучше юзать find_element_by_xpath , что ты на выходе получал элемент , а не массив с 1 элементом.
Логично предположить что получать доступ к обеим таблицам ты должен через .click() по ul[@class='ul-nav'] ибо условие подходит для обеих таблиц

Так какие условие ?
0
14 / 8 / 7
Регистрация: 09.01.2018
Сообщений: 151
12.02.2019, 15:37
Python
1
2
3
4
5
6
7
browser = webdriver.Firefox()
    browser.get('https://www.oddsportal.com/soccer/england/premier-league/tottenham-newcastle-utd-dWi6gO5P/#ah;2')
    browser.implicitly_wait(3)
    table1 = browser.find_element_by_xpath('//*[@id="odds-data-table"]')
    clik = browser.find_element_by_xpath("//li/a[@title='1X2']")
    clik.click()
    table2 = browser.find_element_by_xpath('//*[@id="odds-data-table"]')
Вот так всё выглядит в миниатюре .
Но тебе так понимаю нужен доступ к каждому элементу в таблице. Тогда тебе с table1 u table2 не по пути.
Надо глянуть на структуру строки таблицы , и всё.

Python
1
2
col1 = browser.find_elements_by_xpath('//*[@id="odds-data-table"]/div/div/strong/a')
col2 = browser.find_elements_by_xpath('//*[@id="odds-data-table"]/div/div/span[@class='avg chunk-odd-payout']')
Ну и так далее

Python
1
2
for data in enumerate(col2):
label = data
Ну а дальше знакомишься с каждым элементом списка
Миниатюры
Как различать таблицы с Селениумом?  
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
12.02.2019, 16:37  [ТС]
Цитата Сообщение от Mep3avec Посмотреть сообщение
В смысле сравни ты завесь топик не назвал условия по которому сравнивать.
эм.. какое условие?
у тебя есть список из двух url. с помощью for берёшь поочередно каждый url и парсишь его. но загвоздка в том, что есть два вида таблиц на сайте. соответственно нужно два различных метода парсинга (доступа к элементам).
их объеденяет один div. можно через него подбирать пути к этим данным и, скажем, если один способ не подходит, то используем другой. я представляю себе это через try/except, либо if/else (но они почему-то не работают в моём коде).

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
lst = [
    'https://www.oddsportal.com/soccer/england/premier-league/tottenham-newcastle-utd-dWi6gO5P/', 
    'https://www.oddsportal.com/soccer/england/premier-league/tottenham-newcastle-utd-dWi6gO5P/#ah;2'
]
 
div_nav = driver.find_element_by_css_selector("#odds-data-table")
 
for url in lst:
    try: #if div_nav.find_elements_by_css_selector('span.odds-co'):
        rows = div_nav.find_elements_by_css_selector('span.odds-co')
        print(1)        
    except: #else:
        rows = div_nav.find_elements_by_css_selector('tr.lo')
        print(2)
На выходе должно быть "2, 1", но по этому коду на выходе получаются либо "2, 2", либо "1, 1", в зависимости от выбранного метода.
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
12.02.2019, 18:29
m0nte-cr1st0, при больших объемах данных - нужно сразу подключать postgresql
80 тысяч в день?
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
12.02.2019, 18:44  [ТС]
IRIP, ну пости планируется, что парсер будет постоянно работать.
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
12.02.2019, 20:54
m0nte-cr1st0, тогда нужно каким-то образом (пока не знаю), планировать архитектуру так, чтобы:

1. Была четкая структура базы данных
- например, результаты в одной таблице, а событие, в другой
- например, событие в одной таблице, а свойства события: страна, участники и т.п.
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
12.02.2019, 21:00  [ТС]
IRIP, спасибо. я пока что в первом приближении решаю. оптимизировать потом буду. да и данные хранить не нужно. я хочу поочередно парсить каждую таблицу, делать расчёт и выводить данные (например, событие, время, коэффициент и букмекер) в csv какой-то. Но так как парсер будет работать постоянно, файл будет постоянно перезаписываться.
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
12.02.2019, 22:14
Цитата Сообщение от m0nte-cr1st0 Посмотреть сообщение
делать расчёт и выводить данные (например, событие, время, коэффициент и букмекер)
я понимаю =)
но, поиск вилок, он, эффективен, когда есть выборка минимум от 10 контор (которые не тырят у друг друга данные) =)
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
12.02.2019, 23:12  [ТС]
IRIP, скажем так, мне нужно этот поиск реализовать всего под две конторы (wh и pinnacle).
просто не вижу смысла хранить их в бд.
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
13.02.2019, 03:11
m0nte-cr1st0, важно учитывать динамику изменения коэффициентов (которые могут меняться очень часто)
0
14 / 8 / 7
Регистрация: 09.01.2018
Сообщений: 151
13.02.2019, 10:15
Цитата Сообщение от m0nte-cr1st0 Посмотреть сообщение
эм.. какое условие?
у тебя есть список из двух url. с помощью for берёшь поочередно каждый url и парсишь его. но загвоздка в том, что есть два вида таблиц на сайте. соответственно нужно два различных метода парсинга (доступа к элементам).
их объеденяет один div. можно через него подбирать пути к этим данным и, скажем, если один способ не подходит, то используем другой. я представляю себе это через try/except, либо if/else (но они почему-то не работают в моём коде).
Вчера был сонный по этому пристал с clik.click() , слепому видно что таблицы через урл открываются , хотел было написать немного кода но потом присмотрелся к твоему .
Ты ж вкурсе селениум умеет открывать только новые окна , а твоя проверка производится по отношению к одному окну , а значит и одной таблице поэтому на выходе 2.2 или 1.1
Не поленись и покажи где ты веб драйвер запускаешь

Добавлено через 20 минут
Цитата Сообщение от Mep3avec Посмотреть сообщение
Ты ж вкурсе селениум умеет открывать только новые окна , а твоя проверка производится по отношению к одному окну , а значит и одной таблице поэтому на выходе 2.2 или 1.1
Не поленись и покажи где ты веб драйвер запускаешь
Не я попробовал этот вариант , не помогло.

Добавлено через 6 минут
А нет,
я пробовал так
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
lst = [
    'https://www.oddsportal.com/soccer/england/premier-league/tottenham-newcastle-utd-dWi6gO5P/', 
    'https://www.oddsportal.com/soccer/england/premier-league/tottenham-newcastle-utd-dWi6gO5P/#ah;2'
]
 
 
 
for url in lst:
driver = webdriver.Firefox()
        driver.get(url)
div_nav = driver.find_element_by_css_selector("#odds-data-table")
    try: #if div_nav.find_elements_by_css_selector('span.odds-co'):
        rows = div_nav.find_elements_by_css_selector('span.odds-co')
        print(1)        
    except: #else:
        rows = div_nav.find_elements_by_css_selector('tr.lo')
        print(2)
не сработало из-за try:except:
попробовал так
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
lst = [
        'https://www.oddsportal.com/soccer/england/premier-league/tottenham-newcastle-utd-dWi6gO5P/',
        'https://www.oddsportal.com/soccer/england/premier-league/tottenham-newcastle-utd-dWi6gO5P/#ah;2'
    ]
 
    for url in lst:
        driver = webdriver.Firefox()
        driver.get(url)
        div_nav = driver.find_element_by_css_selector("#odds-data-table")
        if div_nav.find_elements_by_css_selector('span.odds-co'):
            print(1)
        else:
            rows = div_nav.find_elements_by_css_selector('tr.lo')
            print(2)
Вывод 2 .1 , хотя я не очень понимаю как это работает с css селекторам дел не имел.
1
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
13.02.2019, 17:07  [ТС]
Mep3avec, спасибо, я вчера тоже пришёл к тому, что try/except не работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.02.2019, 17:07
Помогаю со студенческими работами здесь

Как различать клиентов на сервере?
Я использую следующую связку - клиент (Unity C#) отправляет запрос на сервер (PHP Retchet), на данный момент на сервере работает уже...

Как различать идентичные устройства?
Здравствуйте. У меня есть несколько одинаковых переходников usb -> ttl. Мне нужно программно их различать, но они имеют одинаковые VID и...

Как различать кнопки мыши?
private void Form1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { ...

Как научить программу различать '1' и '9' от '19'?
Помогите, в string записываются рандомно цифры от 1 до 999 по порядку (К примеру 134678; 3679; ) , в дальнейшем из этого массива будут...

Как различать по какой кнопке нажали?
Я хочу у формы сделать две кнопки. Например 'УДАЛИТЬ' и 'ДОБАВИТЬ'. При перезагрузке страницы (т.е. при submit'е формы) я не могу...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru