• Как с помощью regexp удалить теги, у которых есть атрибут class и style, вместе с контентом?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Плохая идея регекспами такое парсить. Лучше воспользйтесь lxml или любым таким парсером.
    Проблема в том, что у вас внтури такого тега может (теоретически) быть непредсказуемая вложенность других тегов. Рекурсивные и контекстные вещи регекспами делаются очень неудобно.
    Разбейте весь текст запроса на лексемы, например так:
    re.split('<|>')
    И вы получите сисок, где нулевой и все четные элементы - это фрагменты текста, а все нечетные по индексу элементы - это содержимое тегов. Содержимое закрывающих тегов можно распозать по слешу.
    Дальше нужно запрограммировать конечный автомат с двумя состояниями, которому можно скормить этот список, а вернёт он такой же список, но отфильтрует ненужные элементы.
    Грубо говоря, в первом состоянии вы перебираете входной список и когда встречаете нечетный эелемент (тег), начинающийся со слова span и содержащий атрибуты, сбрасываете счетчик в ноль и переходите во творое состояние.
    Во втором - перебираете се элементы и инкрементируете счетчик каждый раз когда попадается открывающий тег, и декрементируете когда попадается закрывающий (нечетный элемент, начинающийся начинается со слеша). Если счетчик снова стал нулём, переходите в первое состояние.
    На выход следует пропускать только элементы находясь в первом состоянии. Второе состояние подавляет выхлоп.
    def f(lexems): 
        state, deep = 0, 0 
        for i, lex in enumerate(lexems): 
            if state == 0: 
                if i%2 and lex.startswith('span '): 
                    state = 1 
                    deep = 1 
                else: 
                    yield f'<{lex}>' if i%2 else lex 
            else: 
                if i%2: 
                    deep += -1 if lex.startswith('/') else 1 
                if deep == 0: 
                    state = 0
    Ответ написан
    Комментировать
  • Не могу передать строку в writerow, что не так?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вот это кошмар...
    Нагромождение каких-то ненужных приседаний и реверансов. Склажывается ощущение. что код писался вообще без понимания что и как работает.
    Тут проще пересчитать строки, которые не требовалось бы исправить: ноль таких строк.
    Вы бы привели хоть пример что у вас там в property подается. А-то на кофейной гуще гадать приходится какая из сотни ошибок-таки окончательно стедала неработоспособным код.

    Вот здесь вообще какая-то ерунда:
    for i in range(j, len(property)):
        k = j
        write_to_csv(property[k])
        k += 1
      j = len(property)

    Ладно, с отступами беда. Но зачем эти бессмысленные присвоения? Зачем этот бессмысленный цикл, если вы в нем обрабатываете один и тот же элемент много раз?
    Прекращайте уже такое писать. Смысла нет. Не ваше.

    Похоже (разводы гущи так подсказывают за неимением других данных) вы не понимаете что передаёте в эту свою функцию. Ситуацию бы прояснила публикаия содержимого переменной roperty
    Ответ написан
    3 комментария
  • Как написать sql запрос?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Уберите из блока SELECT всё, кроме имени девушки.
    Если у них полигамные отношения бывают, то можно SELECT DISTINCT сделать, чтобы полигамные девушки не дублировались.
    Ответ написан
    Комментировать
  • Как записать .mp3 в JSON?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Хранить mp3 вполне логично в файлах в каталоге проекта.
    Если вы по какой-то причине не хотите хранить их россыпью в файловой системе, то можно собрать их в zip-файл без сжатия или в tar-архив. С ними можно работать не распаковывая, открыать и читать файлы внутри.
    Ещё есть встроенный модуль shelve - это персистентный key-value storage, который держит свои ключи и значения в одном файле. Доступны чтение и запись бинарных данных по ключу.
    Base64 приведёт к тому что объём данных увеличится примерно на четверть (на 25 процентов). Сериализация и десериализация больших файлов в текстовый json будет медленным и неэффективным.

    Опишите шире вашу задачу и вам предложат типовое ее решение.
    Ответ написан
  • Local port forwarding with host jumping Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Пробрасывайте последовательно через все туннели, кроме последнего, не 6000 порт, а 22. Пследний туннель пробросит целевой порт. Все коннекты, начиная со второго, должны быть на localhost, а порты ssh придется биндить на разные локальные порты.

    Смотрите, в CLI вы каждый раз на новой уделенной машине стартуете ssh. Технически можно делать это на одной машине, пришивая каждый раз 22 порт следующей удаленной машины на очередной локальный порт.

    Сам не пробовал. пока некогда.
    Ответ написан
  • Как реализовать регистронезависимый поиск в python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Можно, как быстрое решение, продублировать данные в таблице, обработав их снаружи преобразованием в upper case.
    Тогда вам придётся подавать на вход в запросы уже преобразованные (подготовленные под формат индекса) данные.

    А вот здесь есть статья о том как добавить collate для русского регистронезависимого сравнения.
    Ответ написан
  • YouTube ошибка HTTP Error 429: Too Many Requests. Как исправить?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Setaz213, никто вам не скажет сколько нужно ждать. Критерии детектирования недобросовестных пользователей не могут быть публичными, поскольку будучи опубликованными тут же будут использованы с целью настроить скрипты так, чтобы их не блокировали. Читайте в документации ограничения, которые накладывает API. Пользуйтесь прокси-листами, чтобы избежать окончательных блокировок при экспериментах.
    Если пользуетесь API, которым вам пользоваться не положено (то есть нет никакой документации и вообще никаких публичных ограничений), то изучайте с какими частотами дергает это API штатное ПО.
    Ответ написан
    Комментировать
  • Парсинг для чайников?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    В институте парсинга информации при российской академии естественных наук (РАЕН) на кафедре текстов входящих сообщений на тертьем кусе есть дисциплина log-файлы. Там с третьей по сельмую лекции рассказывается как сие сделать. В учебном плане 17 семинаров, 8 лабораторных и 3 РГЗ.

    Если серьёзно, то формулировка вашего вопроса показывает, что вы не понимаете чего хотите или не пишете этого в вопросе. В первом случае вам нужно учиться программировать. Просто программировать. На любых курсах, соответствующих вашему уровню. Потом вопрос такой у вас уже не возникнет и все станет само собой понятно.
    Если вариант 2, то... Курсов парсинга log-файлов не бывает. Это тривиально. Вам нужно учиться более простым вещам прежде чем решать такие задачи.
    Ответ написан
    1 комментарий
  • Транслитер, где ошибка?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    В срезах. Обе границы среза должны указываться абсолютно, а у вас индекс сбрасывается в 1 каждый раз. Такой изнаночный срез будет возвращать пустую строку.
    "abcdef"[3:2] -> ""
    Ответ написан
    2 комментария
  • Как отобразить автоподсказки при типе typing.List[typing.Union] для любого элемента списка?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы хотите странного.
    А именно, по какой то причине хотите сделать заведомо небезопасный код, и при этом хотите, чтобы IDE вам в этом помогал. Это я к чему: кейс, который вы здесь привели, - это антипаттерн; было бы странно ожидать такую специфическую обработку этой ситуации от IDE.

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

    Такие вещи нужно в коде разбирать явно.
    К примеру можно явно проверить переменную на принадлежность типу и IDE это учтёт делая подсказку:
    resp = c.response
    if isinstance(resp, A):
        resp.items[0].
    Ответ написан
  • Как решить задачу sql?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    SELECT
      e.name, SUM(t.hours)
    FROM 
      employees e
        JOIN time_reports t ON t.employee_id = e.id
    GROUP BY e.id, e.name
    ORDER BY 2 DESC
    LIMIT 3
    Ответ написан
  • Как автомоаически создавать страницы на python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    postebayko, с текущим уровнем подготовки у вас просто не получится.
    Вы не знаете как устроен и работает сайт. И мы не знаем. А вы даже не подумали обмолвиться об этом в своём вопросе. То есть совсем ноль, понимаете?
    Начните с того, чтобы понять как устроен ваш сайт, на чем он написан (фреймворк, архитектура), есть ли на нём публичный API для необходимых вам действий.
    Если да, то вам крупно повезло. Читаете документацию к API и там наверняка будут примеры как делать и какие запросы, чтобы выполнить нужные вам действия. Делайте эти запросы из кода вашего бота.
    Ответ написан
    2 комментария
  • Как сделать, чтобы функция возвращала все элементы?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Потому что выход из функции происходит при первом попавшемся return'е с тем значением, которое первое туда попало.
    Учите матчасть. Читайте внимательно.
    Ответ написан
  • Является ли это исключительной ситуацией?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    А БД у вас глобально торчит в виде синглтона? Вы даёте id конструктору пользователя, и этот конструктор сам (!) лезет в БД (какую-то), что-то оттуда подтягивает, бросает исключения в зависимости от внешнего состояния...

    У какой-то другой сущности, к примеру у приложения, должен быть фабричный метод get_user. Он по идентификатору достаёт необходимые данные (этот код можно в классовый метод юзера поместить) и создаёт на основе этих данных инстанс юзера, например передавая все основные данные в конструктор.
    Ответ написан
    3 комментария
  • Считывание данных с веб камеры на Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Не рассматривали устройства видео-захвата, чтобы подключались вместо монитора?
    Есть для всех интерфейсов: hdmi, dvi, vga.
    Бывают еще KVM устройства, которые подключаются в том числе вместо монитора и шарят с него картинку по ethernet

    Если распознавать нужно лишь несколько полей в области видимости камеры, то я бы посоветовал поискать в инете примеры захвата и обработки фото/видео с камеры с помощью opencv
    Камера на против монитора у вас, наверно будет стоять в оптимальном ракурсе, но даже если нет с помощью opencv вполне можно кадрировать, выровнять перспективу, очистить от бликов и сепарировать нужные участки изображения с камеры.
    Когда останутся поля, тем же opencv можно разбить их на символы и распознавать посимвольно. Хотя наверняка емть большое количество OCR решений в виде готовых 1библиотек.
    Ответ написан
  • Крупная БД на docker?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    хорошая идея всё делать в докере. Во многом упрощает жизнь при развёртывании.
    Ответ написан
    Комментировать
  • Сервер для игры?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    flask, bottle...
    Возьмите любой микрофреймворк.
    Ответ написан
    1 комментарий
  • Python как решить проблему с оплатой?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    При выполнении float и sum - одинаковые значения, но они не равны, почему?

    Потому, что нельзя сравнивать float на строгое равенство без учета погрешности.
    Не каждое даже рациональное число можно представить в виде конечной десятичной или двоичной дроби. К примеру, 1/3 в десятичной - бесконечная периодическая дробь, а в троичной "0.1". Так не каждую конечную по числу знаков десятичную дробь можно представить конечной двоичной дробью. Выходит, что от порядка вычислений зависит потеря очень малых фракций числа, связанных с ограниченной точностью (числом битов) float.
    Нужно выбрать порог точности и сравнивать числа с его помощью:
    EPS = 1e-6
    abs(a - b) < EPS
    Ответ написан
    Комментировать
  • Как оптимизировать работу с файлами в Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы можете писать в CSV, прилично сэкономите на этом. CSV-файлы потом легко и быстро конкатенировать системными средствами командной строки. У вас винда, так что COPY, например.
    Самое неприятное, что может случиться - это проснуться на утро и увидеть монолитный гигантский файл (результат ночного бдения вашего скрипта), в котором что-то пошло не так где-то после первых 30-60%.

    Вообще главное - это вопрос одноразовая ли это задача. Если вы такой объём грузите, скажем, каждые пару дней, то, конечно, нужно юзать мультипроцессинг и настраиваеть нормальный пайплайн с автоматизацией и логами.
    Если речь об однократной кастомной обработке в рамках R&D, то не парьтесь, сделайте как проще.

    Пишите в CSV. Разбейте объём простым слайсом на несколько кусков и тупо стартуйте отдельными скриптами. Это сэкономит вам время на отладку мультипроцессинга, не надо городить очередей, тасков и прочего.

    К вашему коду есть вопросы:
    for row in range(1):
                ws.append(list(sheetname_set))

    Зачем здесь цикл?
    Почему не используете pathlib? Код станет надёжнее и лаконичнее.
    Почему не добавили статистику или просто логирование времени работы разных этапов вашего скрипта? Оптимизировать надо начиная с бутылочного горлышка. После первой бутылки задача может показаться не столь актуальной.

    Если речь об R&D и вы не знаете что дальше будете делать с данными, то объективно полезные вещи можно вытягивать и сохранять в своеобразные мета-файлы для последующей быстрой обработки. Это выгодно, если бутылочное горлышко застряло в экселе. Вытащите за один проход всё что может пригодиться в sqlite или хотя бы простые json-файлы по одному на каждый документ.
    Ответ написан