• Как тут имитировать клик каждого обьекта li в dropdown?

    @o5a
    Проблема в том, что item принадлежит изначальному объекту driver (первоначальной загруженной странице). Но после выбора варианта товара (нажатия item.click() ) загружается новая страница с этим вариантом. В результате driver загружается уже другой страницей. А item все так же продолжает ссылаться на объект из первоначальной. Потому и возникает такая ошибка.

    Я не эксперт в селениуме, может есть более правильный способ, но в данном случае навскидку вижу можно просто каждый раз заново искать элемент для клика, перебирая по индексам, вместо объектов item.
    for idx in range(len(items)):
        time.sleep(1)
        # заново ищем элемент
        item = driver.find_element_by_xpath(f"//li[@class='b-custom-drop-down__list-item'][{idx+1}]")
        item.click()
        ...

    В данном случае предполагается, что на каждой такой странице список вариантов одинаковый. Иначе конечно же получим ошибку при попытке выйти за пределы списка.
    Ответ написан
    Комментировать
  • Incorrect number of bindings supplied. The current statement uses 3, and there are 1 supplied. Как решить проблему?

    @o5a
    Ошибка говорит о том, что в качестве параметра execute передается несоответствующее запросу число данных.

    В 'INSERT INTO post VALUES (?, ?, ?)' предполагается 3 значения, а tuple(data.values()) содержит только одно, т.е. в словаре только 1 ключ. Проверяйте, что туда пишете и что хотите взять.
    Ответ написан
    Комментировать
  • TypeError: list indices must be integers or slices, not str в JSON?

    @o5a
    Логично же, что если делать
    njson = [item for item in data['data']['list'] if item['user']['name'] == 'name1']

    то njson будет списком, а не вложенным словарём. И обращаться к его элементам как njson['data']['list'] не имеет смысла.

    Если цель была отфильтровать тот список внутри изначального json, то его и нужно было менять:
    data['data']['list'] = [item for item in data['data']['list'] if item['user']['name'] == 'name1']
    Ответ написан
    Комментировать
  • Как сравнить таблицы?

    @o5a
    Насколько понимаю, в этих таблицах могут совпадать 4 поля, но есть и другие поля?
    Тогда можно их соединить, но именно по этим полям:
    SELECT *
    FROM mytable1 t1, mytable2 t2
    WHERE t1.field1 = t2.field1
    AND t1.field2 = t2.field2

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

    Но в целом, как Вам уже говорили, идея делать это разными таблицами в корне неправильная. Если нужно было разделение по пользователю, то user_id надо было делать полем таблицы, а не создавать под пользователя отдельную таблицу.
    Ответ написан
    1 комментарий
  • Как изменить переменную в бд, при условии наличия нужного параметра из того-же бд?

    @o5a
    Если речь про формирование бонуса по условию, зависящему от других полей (как в данном случае buster1 и т.п.), можно это прописать в самом запросе через оператор case (по логике похоже на ветвления if в самом python). Например:

    sql = "UPDATE users SET balance = balance + \
    CASE WHEN buster1 = 'Нет' AND buster2 = 'Нет' AND buster3 = 'Нет' THEN 0.010 \
        WHEN buster1 = 'Да' AND buster2 = 'Нет' AND buster3 = 'Нет' THEN 0.050 \
        WHEN buster1 = 'Да' AND buster2 = 'Да' AND buster3 = 'Да' THEN 0.100 \
    END \
    WHERE id = ?"

    И соответственно в запросе передавать только id пользователя, сам бонус будет считаться автоматически.
    Таким образом сами формируете зависимость бонуса от этих полей.

    Если же имелось в виду что-то другое, лучше пишите подробнее с примером.
    Ответ написан
    1 комментарий
  • Почему функция срабатывает дважды?

    @o5a
    Перепроверьте еще раз свой код. В приведенном куске указанной проблемы нет: для каждой опции все будет срабатывать только 1 раз. Можете сами проверить приведенный кусок в отдельном скрипте. Если что-то повторяется, значит или этот кусок отличается от реального кода, или в остальном коде функция повторно вызывается.

    И не стоит комментировать каждую строку. Комментарии должны помогать понять логику работы куска кода, а не дублировать сам код. Нет никакого смысла в подобных комментариях:
    return bd #возвращаем получившуюся БД
    Ответ написан
    Комментировать
  • Как победить ошибку "name is not defined"?

    @o5a
    1. Чтобы интерфейс работал, нужно запустить цикл (mainloop)
    ...
    btn.pack()
    
    root.mainloop()

    А чтобы продолжить работать с телеграмом потом (если нужен его цикл), можно прекратить работу tk, вызвав root.destroy()
    2. Свою функцию messages = ut нужно вызывать уже после того, как переменная ut установлена. Например, в той же самой функции conn:
    def conn():
        ut = user_text.get()
        root.destroy()
        telegram_send.send( messages = ut )
    Ответ написан
    Комментировать
  • Как сделать, чтобы бот не обращал внимания на пунктуацию?

    @o5a
    Можно через str.translate удалить все указанные символы по списку
    text = 'Как съесть яблоко?'
    text = str.translate(text, str.maketrans('', '', '.,?:-;/\\'))
    Ответ написан
    9 комментариев
  • Не понимаю, как исправить ошибку. Почему выдает тип str?

    @o5a
    Проблема в использовании min(x) на
    x = pd.DataFrame(dataset.Open)
    В данном случае она возвратит название колонки, т.е. строку. Чтобы найти минимум по данным, надо явно указать, по какой колонке искать, т.е. min(x.Open)
    Или же изначально x делать не DataFrame, а Series
    x = pd.Series(dataset.Open)
    Тогда можно использовать min(x)
    Ответ написан
    Комментировать
  • Как создать DataFrame из xml?

    @o5a
    Не нужно перебирать элементы 'works' в том же цикле, где и добавляются строки к DF. Если их перебирать, то и складывать в одну строку (через запятые), а потом уже создавать запись в pandas. Или же вообще этот цикл заменить на join():
    for elem in root:
        elements = [elem[0].text, elem[1].text, elem[2].text, ','.join(val.text for val in elem[3])]
        df = df.append(pd.Series(elements, index=df_index), ignore_index=True)

    Еще стоит учесть, что в таком коде обращение по индексам (elem[0].text и подобное) создает жесткую привязку к позиции узла в xml. Если порядок поменяется, то столбцы будут парситься неверно. Возможно стоило использовать более явное указание: elem.find('name').text
    Ответ написан
    Комментировать
  • Как наложить фото на гринскрин в Python?

    @o5a
    Можно так например. Учитывая указанный цвет зеленого, заменяем его по всему гринскрину на прозрачный, затем подмешиваем второе изображение с учетом этой маски.
    Возможно есть более эффективные способы, но так тоже работает.
    from PIL import Image
    
    # заменяет указанный цвет на прозрачный
    def make_transparent(image, color):
        new = []
        for item in image.getdata():
            if item[:3] == color:
                new.append((255, 255, 255, 0))
            else:
                new.append(item)
        image.putdata(new)
    
    GREEN = (x, y, z) # указываем цвет нашего зеленого на "гринскрине"
    img_filename = "images/image.png"
    screen_filename = "images/green.png"
    
    img = Image.open(img_filename).convert('RGBA')
    screen = Image.open(screen_filename).convert('RGBA')
    
    make_transparent(screen, GREEN)
    
    new = Image.alpha_composite(img, screen)
    new.save('new_image.png')


    Другой вариант - аналогично перебирать оба изображения и использовать пиксели первого/второго в зависимости от цвета пикселя гринскрина.
    Ответ написан
    Комментировать
  • Почему не работает ИЛИ в re python?

    @o5a
    re.compile(r'WHERE(.+?)(GROUP BY|;)', re.S)
    Но для большей точности лучше добавить токены '\b' ограничивающие слова, иначе WHERE может поймать и как часть другого слова.
    Ответ написан
    3 комментария
  • Как к этому регулярному выражению добавить символы верхнего и нижнего регистра?

    @o5a
    Почитайте про флаги. В данном случае добавить re.I
    regex = re.compile(r'.*(.)(\1)(\1)(\1).*$', re.I)
    Ответ написан
    6 комментариев
  • Python Selenium как нажать на кнопку "отмена" в окне печати?

    @o5a
    find_elements_by_class_name возвращает список элементов, так что нужно добавить индекс нужного элемента.
    В данном случае предполагаю этот элемент только один, так что можно проще - использовать другую функцию, для единственного элемента:
    driver.find_element_by_class_name('cancel-button').click()
    Ответ написан
    9 комментариев
  • Xpath python как взять 2 элемент с похожим классом?

    @o5a
    find_elements_by_xpath выведет список всех элементов с таким xpath
    Ответ написан
  • Как правильно хранить в Sqlite числа с плавающей точкой что бы в дальнейшем удобно производить выборку по этим данным?

    @o5a
    Вы что-то намудрили при создании таблицы. У вас тип полей не real, а BLOB, это бинарный тип. Поэтому он и выдает такие значения. Возможно до этого экспериментировали и создали таблицу с типом BLOB, поэтому новая с типом REAL не пересоздалась. Грохните ее и создайте заново. Будет выдавать нормальные типы (real из sqlite должен выдавать как float)
    И заодно, по поводу структуры. Создавать 256 полей под 256 значений выглядит не очень, да и удобство сомнительное. Лучше было их записывать построчно, с нумерацией, т.е. таблица вида:
    (id_photo, h_num, h_value)
    тогда и запись будет не так монструозно выглядеть, и запрашивать нужное значение тоже удобно будет
    select * from photos where id_photo = ... and h_num = 1
    или
    select * from photos where h_num = 1 and h_value > 30
    Ответ написан
    1 комментарий
  • Правильно ли связанны мои таблицы в sqlite?

    @o5a
    1. Лучше не разделять таблицы с фото на 2 разных. Судя по описанию задачи структура и хранимые в них данные абсолютно идентичны по сути. Так что лучше использовать единственную таблицу для хранения всех этих вариантов фото. А для разделения (лицо/котики/возможно еще какой вариант захотите добавить) использовать отдельное поле в таблице, photo_type например.
    2. В представленном коде у Вас из таблицы фотографий идет FK на таблицу пользователей. Если таблица фото предполагает хранение самих данных (что за поле h1? это сами данные фото?), то правильнее сделать наоборот: в таблице пользователей хранить id из таблицы фото, с соответствующим FK.
    Т.е. примерно так
    CREATE TABLE IF NOT EXISTS users(user_id INTEGER  NOT NULL PRIMARY KEY, 
                    photo_id INTEGER NOT NULL, 
                    registration_date TEXT, 
                    actual_name TEXT, 
                    real_name TEXT, 
                    old_names TEXT, 
                    friends INT, 
                    level INT, 
                    country TEXT, 
                    profile_summary TEXT, 
                    src TEXT,
    FOREIGN KEY (photo_id) REFERENCES photos(id))
    
    CREATE TABLE IF NOT EXISTS photo_type(photo_type INTEGER PRIMARY KEY,
                      photo_type_name TEXT)
    
    CREATE TABLE IF NOT EXISTS photos(id INTEGER PRIMARY KEY AUTOINCREMENT,
                      photo_type INTEGER,
                      h1 INT,
    FOREIGN KEY (photo_type) REFERENCES photo_type(photo_type))

    3. По формату данных. Можно хранить как INT, FLOAT, насколько знаю там еще вроде можно NUMERIC, это как аналог десятичного числа.
    6.1000e+01

    А точно у Вас десятичные числа? Приведенный пример по факту целое число 61.
    массив из 256 не целых чисел в базу(гистограмму картинки)

    Как таковых массивов sqlite насколько знаю не поддерживает. Чтобы хранить придется заносить каждое число в отдельную строку с соблюдением порядка (id autoincrement в принципе с этим справится). Не факт, что это лучший вариант хранения этих данных, ведь по факту насколько я понимаю никогда не понадобится выбрать конкретное число из этой гистограммы, она нужна всегда только как массив - полностью записываем, полностью считываем.
    Так что для такой задачи возможно лучше не плодить их в таблице, а просто завести текстовое поле и хранить там этот список чисел в виде json. В sqlite можно даже написать автоматическое преобразование данных, т.е. в колонку пишется список, а сохраняется как json, аналогично при чтении. Пример.
    Ответ написан
    Комментировать
  • TypeError: 'module' object is not callable. Как исправить?

    @o5a
    telebot.py

    НЕ называйте больше свои скрипты так же, как сами модули (в данном случае telebot). При таком синтаксисе скрипт пытается импортировать такой скрипт вместо самого модуля телеграм.
    Ответ написан
    Комментировать