Задать вопрос
  • Как спарсить наклейки на предмете стим?

    Vindicar
    @Vindicar
    RTFM!
    Так же, как и всегда. Стим кучу инфы подгружает фоновым запросом.
    В инструментах разработчика в браузере смотришь XHR-запросы, которые делает страница.
    Ищешь запрос, которые содержит инфу о предметах.
    Разбираешься с его параметрами и содержимым, экспериментируешь. Скорее всего в параметрах будут какие-то ID инвентаря и указатель на то, сколько предметов пропускать (пагинация). Содержимое вроде у них JSON, который тривиально парсится одноименным модулем питона.
    А потом просто делаешь этот запрос, меняя параметры.
    Ответ написан
    1 комментарий
  • Как зделать валидацию аргумента?

    Vindicar
    @Vindicar
    RTFM!
    Zakkaru, читай документацию на используемую библиотеку. Если для discord.py, то тут тут.
    Ответ написан
    Комментировать
  • Как вписать в replace() два символа заменить одним?

    Vindicar
    @Vindicar
    RTFM!
    Используй str.maketrans() чтобы создать таблицу подстановок, и str.translate() чтобы применить её к строке.
    Плюс в том, что с помощью translate() можно также легко проворачивать замены вида "заменить X на Y, и одновременно заменить Y на X".
    Ответ написан
    1 комментарий
  • Почему в одном проекте импорты работают, а в другом нет?

    Vindicar
    @Vindicar
    RTFM!
    может потому что винда находит pip3 в PATH и использует его?
    Попробуй указать прямой путь до pip3 в конкретном venv.
    Ответ написан
  • Как нажать и держать кнопку?

    Vindicar
    @Vindicar
    RTFM!
    Кнопку мыши?
    Послать событие mouse down, подождать сколько надо держать, послать mouse up.
    Точные методы не вспомню, нужно рыться в документации на selenium.
    Ответ написан
    Комментировать
  • Как грамотно использовать progress bar в коде?

    Vindicar
    @Vindicar
    RTFM!
    Тебе нужно дать ткинтеру шанс перерисоваться, и обработать другие оконные сообщения.

    pb.config(value=format(per))
    win.update_idletasks()
    Ответ написан
  • Как сделать скриншот элемента на странице с помощью Python и необходимых для этого библиотек?

    Vindicar
    @Vindicar
    RTFM!
    Именно скриншотом, т.е. картинкой? Тогда selenium в руки.
    Ответ написан
    Комментировать
  • Как вывести все слова строки, содержащие нечетное количество букв относительно центра слова?

    Vindicar
    @Vindicar
    RTFM!
    for i in a:

    Если применить оператор for к списку, он перечисляет элементы списка, а не индексы.
    Так что не len(a[i]) а len(i)
    Ответ написан
    Комментировать
  • Как найти все URL и URI внутри HTML с помощью Python?

    Vindicar
    @Vindicar
    RTFM!
    Я бы всё же копал в сторону регулярок. Слишком уж много мест где URL могут встретиться.
    Так что я бы сказал примерно такое...
    (["'])(https?://.+?)\1
    Т.е. "в начале кавычка или апостроф, затем что-то, начинающееся с http:// или https://, потом любые символы, но как можно меньше, а потом тот же символ что и в начале".
    Написал маленький скрипт, натравил его на исходник этой страницы - по-моему, работает неплохо.
    Ответ написан
  • Как отслеживать посетителей на сайте, которые перешли из мессенджеров?

    Vindicar
    @Vindicar
    RTFM!
    document.referer - на клиентской стороне.
    На серверной стороне - HTTP-заголовок Referer.
    А вообще - нет, способа нет, так как ссылки во внешних приложениях не дают Referer.
    Есть обходные пути.
    1. Включать в ссылку какой-то referer ID, тогда можно будет отследить, кто перешел на сайте по этой конкретной ссылке.
    2. Если мессенджер использует страницу с предупреждением о переходе по ссылке (как Steam, например), то тогда переход будет с этой страницы, и его можно будет отследить. Но это зависит от мессенджера.
    Ответ написан
    Комментировать
  • Как реализовать мульти-поточность в боте Telegram (Aiogram)?

    Vindicar
    @Vindicar
    RTFM!
    Мешать многопоточность с асинхронностью - плохая идея.
    А вообще зависит от реализации server.status(). Если оно делает синхронный сетевой запрос, то конечно бот встанет на время его выполнения.
    Если нет асинхронной реализации, я бы запустил новый таск, который в цикле раз в минуту-две опрашивает сервер и запоминает текущий онлайн. А по команде отдавал бы только последнее запомненное значение.
    В принципе можно использовать loop.run_in_executor() для выполнения потока как асинхронной задачи. Это более-менее безопасно.
    Ответ написан
    Комментировать
  • Как исправить ошибку питон?

    Vindicar
    @Vindicar
    RTFM!
    А ты уверен, что браузер делает DNS запрос к домену?
    У него может быть кэш.
    У ОС может быть кэш.
    Браузер может использовать один из вариантов DNSSEC.
    Вариантов много.
    Ответ написан
  • Какие инструменты использовать для распознования круглых объектов на изображении?

    Vindicar
    @Vindicar
    RTFM!
    Думаю, можно попробовать преобразование Хафа (Hough transform). Оно может обнаруживать не только окружности.
    Либо можно попробовать применить пороговое преобразование (простое/адаптивное), а потом уже делать градиент и Хафа.
    Ответ написан
  • Как найти простые числа в диапазоне?

    Vindicar
    @Vindicar
    RTFM!
    Решето Эратосфена предполагает удаление элементов, кратных очередному простому числу.
    Т.е. обработали 2 - вычеркиваем каждый 2й элемент. Обработали 3 - каждый третий, и так далее.
    Отсюда получаем следующее.
    У нас есть исходный список элементов.
    numbers = list(range(2, n+1))
    На каждом шаге, когда мы проверяем число k, мы выкидываем все числа, кратные k, кроме самого k.
    numbers = [ x for x in numbers if x % k != 0 or x == k]

    А как мы выбираем k? Просто идём по списку чисел от начала. Все элементы в начале списка всегда будут простыми, так как 2 - простое, а все последующие составные элементы будут выкинуты на одной из итераций
    i = 0
    while i < len(numbers):
      k = numbers[i]
      numbers = [ x for x in numbers if x % k != 0 or x == k ]
      i += 1
    Ответ написан
    Комментировать
  • Как реализовать валидацию?

    Vindicar
    @Vindicar
    RTFM!
    Ну можно и через лямбды, но - имеет ли это смысл? В чем будет выигрыш по сравнению с простым try except?
    Будет менее читаемо, по-моему.

    К сожалению, суп не поддерживает из коробки XPath - эта штука позволяла бы задать селектор как в примере одной строкой вида
    //li[contains-token(@class, 'CardInfoRow_year')]//span[contains-token(@class, 'CardInfoRow__cell')][1]/a[contains-token(@class, 'link')]


    Можно наколхозить грубое подобие:
    class BSItem: # одиночный элемент
        def __init__(self, item):
            self._item = start
        
        def __bool__(self):
            return bool(self._item)
        
        def __str__(self):
            return self._item.contents[0] if self else ''
        
        @property
        def tag(self):
            return self._item
        
        def __truediv__(self, other): # оператор / ищет один элемент
            if not self: # пустой элемент так и останется пустым
                return self
            if isinstance(other, str): # item / 'tag.classname'
                tag, _, cls = other.partition('.')
                if cls:
                    return BSItem(self._item.find(tag, class_=cls))
                else:
                    return BSItem(self._item.find(tag))
            if isinstance(other, int) and other == 0: # item / 0 == item
                return self
            if callable(other): # item / lambda tag: tag.has_attr('id')
                return BSItem(self._item.find(other))
            raise ValueError() # передали ерунду
        
        def __floordiv__(self, other): # оператор // ищет все элементы
            if not self:
                return BSItems([])
            if isinstance(other, str): # item // 'tag.classname'
                tag, _, cls = other.partition('.')
                if cls:
                    return BSItems(self._item.find_all(tag, class_=cls))
                else:
                    return BSItems(self._item.find_all(tag))
            if callable(other): # item // lambda tag: tag.has_attr('id')
                return BSItems(self._item.find_all(other))
            raise ValueError()
    
    
    class BSItems: # коллекция элементов
        def __init__(self, items):
            self._items = items
        
        def __bool__(self):
            return bool(self._items)
        
        def __iter__(self): #позволяет делать for tag in BSItems:
            return iter(self._items)
        
        def __len__(self):
            return len(self._items)
        
        def __truediv__(self, other): # оператор / ищет один элемент в каждом элементе
            if not self: # пустой элемент так и останется пустым
                return self
            if isinstance(other, str): # item / 'tag.classname'
                tag, _, cls = other.partition('.')
                if cls:
                    return BSItems([item.find(tag, class_=cls) for item in self._items])
                else:
                    return BSItem([item.find(tag) for item in self._items])
            if isinstance(other, int): # items / 2 найдет третий элемент в коллекции
                return BSItem(self._items[other]) if len(self._items) > other else BSItem(None)
            if callable(other): # items / lambda tag: tag.has_attr('id')
                return BSItems([item.find(other) for item in self._items])
            raise ValueError() # передали ерунду
        
        def __floordiv__(self, other): # оператор // ищет все элементы
            if not self:
                return self
            if isinstance(other, str): # item // 'tag.classname'
                tag, _, cls = other.partition('.')
                result = []
                for item in self._items:
                    result.extend(item.find_all(tag, class_=cls) if cls else item.find_all(tag))
                return BSItems(result)
            if callable(other): # item // lambda tag: tag.has_attr('id')
                result = []
                for item in self._items:
                    result.extend(item.find_all(other))
                return BSItems(result)
            raise ValueError()


    За точность кода не ручаюсь, но идею должен передать.
    Пример использования будет примерно такой:
    year_tag = BSItem(soup) / 'li.CardInfoRow_year' // 'span.CardInfoRow__cell' / 1 / 'a.Link'
        year = str(year_tag) or '-'
    Ответ написан
  • Как изменить вывод длинного не целочисленного числа на питоне?

    Vindicar
    @Vindicar
    RTFM!
    Если знаешь, сколько знаков после запятой тебе надо - то print(f'{a:.12f}') где 12 - сколько знаков после запятой выводить.
    Ответ написан
    2 комментария
  • Почему моя функция всё время возвращает "False"?

    Vindicar
    @Vindicar
    RTFM!
    Метод .sort() списка сортирует список на месте, и возвращает None.
    Если нужна отсортированная копия списка без изменения оригинала, функция sorted() в помощь.
    А вообще, можно же ещё проще. Список сортируем по возрастанию? Тогда нужно убедиться что каждый следующий элемент больше предыдущего.
    def is_sorted(lst) -> bool:
      for i in range(0, len(lst)-1)
        if lst[i] > lst[i+1]: #нашли элементы в неправильном порядке
          return False #значит не отсортирован
      # если сюда дошли, то отсортирован
      return True

    Или то же самое но короче
    def is_sorted(lst) -> bool:
      return all( lst[i] <= lst[i+1] for i in range(0, len(lst)-1) )
    Ответ написан
    Комментировать
  • Как задать время мута, бана в команде?

    Vindicar
    @Vindicar
    RTFM!
    get_args() → Optional[str]
    Судя по документации, get_args() возвращает строку, идущую после команды, или None. Разбор этой строки - уже твоя забота. Например, так:
    1. присвоить результат .get_args() переменной и убедиться, что это не None.
    2. ободрать пробелы с помощью .strip()
    3. превратить в int()/ float() и поймать исключение, если в строке не число
    4. использовать полученное значение.
    Ответ написан
    2 комментария
  • Как лучше осуществить запись в файл python при асинхронной работе?

    Vindicar
    @Vindicar
    RTFM!
    Очень много факторов влияет.
    Если нужно записать несколько килобайт на жесткий диск, то можно и так.
    А если потом внезапно выяснится, что требуется записать несколько десятков мегабат на удалённое хранилище, то могут возникнуть проблемы.
    Так что зависит от решаемой задачи.
    Ответ написан
  • Как в каждом проекте автоматически работать в PyCharm с тем версиями библиотек, которые прописаны в requirements.txt?

    Vindicar
    @Vindicar
    RTFM!
    Вообще PyCharm вроде умеет создавать виртуальные окружения (читай - локальные копии питона) для своих проектов? Тогда просто в каждом проекте создай свой venv, установи локально в него нужные пакеты и работай так.
    Но точнее сказать затрудняюсь, с PyCharm сам не работал.
    Ответ написан
    2 комментария