Задать вопрос
  • Есть ли таблица сравнения языков программирования?

    nullnull
    @nullnull
    https://ru.wikipedia.org/wiki/Сравнение_языков_про...

    https://habr.com/ru/company/skillfactory/blog/531360/

    такое?

    Если выбираете для себя "какой ЯП учить". то сначала определитесь "куда и зачем", а там уже и сравнивайте.
    А то у вас сейчас "мне надо сравнить щуку, рака и лебедя, но я не знаю зачем, но надо".

    Т.к. ЯП бывают разными: по типу запуска или их структуре, по области применения. и т.д. И иногда это сравнивать как тёплое с мягким - не корректно :)
    Ответ написан
    7 комментариев
  • Как разделить значения на списки?

    nullnull
    @nullnull
    1. Вы его теряете, потому что у вас цикл идёт "до предпоследнего".
    А где обработка последнего элемента? Не ясно.

    2. Всё ещё плохо и запутанно объяснили. что хотите получить.
    Покажите два массива: что есть и что должно в итоге быть (массива\списка, не текст).
    Ответ написан
    Комментировать
  • Как приконектиться к базе 1 раз?

    nullnull
    @nullnull
    Из-за того, что параметр называется также, как глобальная переменная, вот и не работает.
    Примерно должно быть так:

    UPD: исправлен пример, спасибо MinTnt за внимательность
    import sqlite3
    
    db = sqlite3.connect('base.db')
    cursor = db.cursor()
    
    def  add():
        a = 1
        cursor.execute('INSERT INTO base(number) VALUES("{}")'.format(a))
    
    def change():
        pass
    
    add()


    А ещё лучше в if-name-main стиле:
    https://ru.stackoverflow.com/questions/515852/
    import sqlite3
    
    def  add(cursor):
        a = 1
        cursor.execute('INSERT INTO base(number) VALUES("{}")'.format(a))
    
    def change(cursor):
        pass
    
    if __name__ == "__main__":
        db = sqlite3.connect('base.db')
        cursor = db.cursor()
        add(cursor)
    Ответ написан
  • Почему в парсер не приходят данные?

    nullnull
    @nullnull
    Есть вариант, что первый просто загружает данные через JS или что там нынче модно, и вы просто не можете в таких парсерах получать данные. Или он вам присылает страницу для robot, хоть и есть Юзер-агент.

    Поставьте точку остановки на строке "tree = lxml.html.document_fromstring(html_text)" и запустите через дебаг.
    Посмотрите, как выглядит страница html_text, всё ли с ней нормально?
    Потом посмотрите в браузере "исходный код страницы", есть ли там то, что вы ищите.

    Если всё это есть, то ошибка у вас в коде или в xPath запросе. А если этого нет в html_text, то и получить это нельзя таким способом :) Придётся менять подход или инструменты для парсинга.
    Ответ написан
  • Как записать данные функции в файл?

    nullnull
    @nullnull
    Ой, я немного приведу код в if-name-main стиль, такую смесь функций и глобальных строк трудно читать :)))


    К сожалению код не запускала, но попробуйте что-то в этом духе :)
    import requests as r 
    from bs4 import BeautifulSoup as bs
    
    def parse_eng(soup, num, skipNum):
      result = []
      for i in num:
        if i  not in skipNum:
          words_eng = soup.find('span', class_ = 'highlightLine puzEng line'+str(i)).get_text()
          # print(words_eng)
          result.append(words_ru)
      return result # возвращаем список строк
    
       
            	
    def parse_ru(soup, num, skipNum):
      result = []
      for i in num:
        if i  not in skipNum:
          words_ru = soup.find('span', class_ = 'highlightLine line'+str(i)).get_text()
          # print(words_ru)
          result.append(words_ru)
      return result
    
    
    # та самая функция для сохранения результатов в файл
    def saveFile(fileName, data):
      file = open(fileName, 'w', encoding='utf-8')
      file.writelines(data)
      # если запишет всё в одну строчку, без переносов, 
      # то можно через цикл с write(),
      file.close()
    
    
    if __name__ == '__main__':
      url = 'https://en.lyrsense.com/lil_peep/nuts'
      res = r.get(url)
    
      if res.status_code !=  200  :
        print('ERROR')
        return # если подразумевается, что дальше не используете программу
        # можно заменить на else
    
      skipNum = [7,12]
    
      soup = bs(res.text, 'html.parser')
    
      num = range(1,24)
    
      title = soup.find('h2', class_ = 'hs').get_text()
      print('$Название песни$ - ', title )
    
      
      data = parse_ru(soup, num, skipNum)
      saveFile(title + '.txt', data)
    
    
    
      '''chose = input('Выберите язык текста : ')
      if chose == 'англ':
        data = parse_eng(soup, num, skipNum)
        saveFile(title + '.txt', data)
      elif chose == "рус":
        data = parse_ru(soup, num, skipNum)
        saveFile(title + '.txt', data) '''
    
      print('///Cохраненно в', title +  '.txt', '///')
    Ответ написан
    2 комментария
  • Как сделать, чтобы BOT на Python читал слова без символов?

    nullnull
    @nullnull
    В зависимости от того, как бот читает слова и что потом с ними делает.

    1. Если ему нужен список отдельных слов, то вот в этом примере (первый ответ) привели разделение при помощи регулярок. ru.stackoverflow.com/questions/905570

    2. Если регулярки сложно, и копипаста не помогла, то вариант проще: строки и обработка строк, например, replace, strip и split.
    replace - можно выбрать символы и убрать их. Что можно бывает. перенос строк, таб (это всё спец.символы. если что), и далее все символы с клавиатуры, что не буквы. Хотя по мне, этот вариант менее рациональный, чем первый, потому что удалять из текста много что можно.

    3. Ещё проще: вырезать слова, проходясь по циклу и собирая их строчку и строчку в список. Это как первый вариант, но без регулярок, опят же.

    А так же можно задуматься над:
    • что если там не одно слово, а целая фраза? Надо подумать про склеивание предложений, можно через join в строках. Или проход по массиву\списку строк и смотреть соседний элемент.
    • что если там будет слово с заглавной буквы? Не забыть про lower() в строках
    • А если хочется для бота больше осознанности? Погуглить в сторону "что такое графы" и "что такое конечные автоматы", есть бесплатные курсы. Тогда бота будет интереснее разрабатывать, смотря зачем :)
    Ответ написан
    Комментировать
  • Как отобразить что юзера нет в базе данных?

    nullnull
    @nullnull
    Возможно, заработает так :)

    else:
                flash('You are not in database')
                return redirect(url_for('test'))
    
    
    ...
    
    @app.route('/test/', methods = ['GET','POST'])
    def test():
         return render_template('test.html')
    Ответ написан
    Комментировать
  • Как исправить ошибку при создании таблицы SQLAlchemy?

    nullnull
    @nullnull
    Возможно, проблема в пути к бд.
    Попробуйте заменить это

    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///tmp/dpd_test.db '


    на это

    import os
    app.config['SQLALCHEMY_DATABASE_URI'] =  'sqlite:///' + os.path.join( os.path.abspath(os.path.dirname(__file__)), 'mydb.db' )


    Тут в os.path.join можно после os.path.abspath. через запятую, указать папки и название файла как угодно, разумеется.
    Ответ написан
    8 комментариев
  • Где ошибка в написании программы по нахождению одинаковых цифр числе?

    nullnull
    @nullnull
    Конкретно в вашем коде ошибка такая:

    x = int(input('Введите число:'))
    
    def array(x):
        global a
        a = []
        while x > 0:
                b = x % 10
                a.append(b)
                x //= 10
                return list(reversed(a)) <----------- этот return стоит внутри цикла и, поэтому, он вернёт только одну цифру. Это ошибка.
    
    
    print(array(x))
    for i in range(len(a)): <------------ из-за a[i+1] вы нарушили граничные значения, будет ошибка.
        while i<=1: <---------------------- этот цикл зациклился, т.к. вы не изменяете i внутри цикла while. 
    И если первые две цифры не будут равны, то ничего не произойдёт, бесконечный while.
            if a[i] == a[i+1]:
                print('да')
                break
    else:
            print("нет")


    Как бы я предложила бы улучшить этот код:
    1. Хорошо подумать и написать алгоритм на листочке: что есть (данные), что нужно сделать (действия), что должно получиться (данные).
    2. Заменить while на for (с другим счётчиком, разумеется), потому что тема while'ов у вас не раскрыта :)
    3. Изучить область работы break: какой цикл остановится. На примере вашего кода break не останавливает for, если что.
    4. Аналогично изучить работу return
    5. Изучить тему "соседние элементы в массиве", "границы в массиве", "как изменять границы если индексы i+1,i+2, i-1, i-3"
    Ответ написан
    Комментировать
  • Полезные курсы по тестированию, практика?

    nullnull
    @nullnull
    Прочитать книжки по тестированию (как минимум 2 популярных, грех не знать). Из курсов неплохие у специалиста.

    Есть ещё такая тема, как краудтестинг https://habr.com/ru/company/badoo/blog/415289/ , сервисы рабочие, задачи раздают, руку понабивать самое то.

    Лучший, на мой взгляд, сертификат, это сдать экзамен ISTQB. Причём такой сертификат, или даже квалификацию рассматривают и в других странах (за все страны и компании говорить не буду, но некоторые забугорные тестировщики говорят, что компании рассматривают).
    Вот вариант подготовки к нему istqb.somee.com .
    Ответ написан
    Комментировать
  • Как вытащить связку почта:пароль из текста?

    nullnull
    @nullnull
    Ну если у вас текст выглядит как
    'https://site.com/:' + 'login@hutchdyer.com:' + 'password'

    то я бы разбила сплитом по ":" и достала бы нужные части по индексу с конца.

    Но вот если у вас пароль будет содержать те же символы (':') то такой способ не подойдёт, я бы предложила такой вариант:

    s = 'https://site.com/:login@gmail.com:pass:wo:::rd'
    sList = s.split(':')
    login = sList[2]
    password = ':'.join(sList[3:])
    print(login, password)
    Ответ написан
    Комментировать
  • Какую технику тех дизайна применить?

    nullnull
    @nullnull
    Вот есть такая задачка, я понимаю что здесь нужно использовать технику "Тест дизайна" - "Граничные значения", насколько это правильно?

    "Граничные значения" и можно ещё "классы эквивалентности", грубо говоря, сгруппировать примеры.
    Так что да, верно.

    Я думаю проверить следует следующие значения:
    -1/0/1/599/600/601/1999/2000/2001/2999/3000/3001/max


    Полагаю, случай с 600 спорный для "минимального набора". Объясню почему.

    у вас есть следующие границы: 0-1999 = 0%
    2000 - 2999 = 2%
    3000 - inf = 5%

    Т.е. используя идею граничный значений 600 долларов это не совсем граница, где меняются проценты.
    А ещё можно сюда внести "класс эквивалентности", типа кратный или не кратны 600, например,
    чем 599 отличается от 1? да ничем с т.з. 600 и 599 или 600 и 1.
    Оба варианта (599 и 1) это не 600 и находятся в границах 0-599.

    Поэтому из минимального набора я бы этот вариант выкинула.
    Действуя такому принципу, некоторые тоже бы выкинула, оставив эти варианты:
    1. -1, 0, 1
    2. 1999, 2000, 2001
    3. 2999, 3000, 3001


    Граничные условия - это проверка условий, вида:
    if a < b < c:
        do_something
    else:
        do_something


    И наиболее часто встречаемые тут ошибки - это путают знаки (человеческий фактор) или забывают поставить знак = или, наоборот, добавляют, когда не надо (это уже слабая математика, множества).

    И в случае подобных задач, надо проверить - входит ли элемент в какое-то множество или нет. И если входит, то надо ещё понять, в какое множество он входит.
    Например. там стоит такая ошибка: x > 3000 = 5%, т.е. тут пример, когда забыли поставить "=" и значение 3000 попало в раздел "2%" или куда-то ещё, но не в 5%.

    Отдельно можно ещё проверить всякие дробные значения, например,
    1999,99 - это 1999 или 2000? округление в какую сторону будет, если будет? Т.е. обратить внимание на типы данных. Хотя бы 1 тест, если криво, то криво будет везде.

    Но вот как оформить тест кейсы, не совсем понимаю.

    https://www.software-testing.ru/library/testing/ge...

    Как пример оформления. Если у вас в задании не указано что-то конкретное, то подгуглить и использовать шаблон.
    Обязательно указывайте что вводите (те примеры) и что ожидаете от таких ответов.
    Ответ написан
    3 комментария
  • Как нажать на кнопку "см. ещё" в вакансиях inkedin с помощью selenium?

    nullnull
    @nullnull
    Я вам подкину парочку мыслей, вдруг что-то получится:

    1. Сейчас веб-фреймворки эти id генерируют на лету, т.е. динамический id получается. Либо другой XPath использовать, либо селекторы, либо XPath по типу "//путь до элемента/тег[contains(@id, "ember")]".Такая же проблема может быть с классами (там где используются числа или же какие-то непонятные символьные генерации).

    Чтобы проверить что видит selenium: просто запустите в дебаге, поставьте точку остановки и f12 (или ctrl + shift + c) по коду элемента в браузере. Возможно, вы увидите, почему клик не отрабатывает.
    Так же вы можете в браузере запустить поиск по XPath (зайти в просмотр кода элемента f12 и там уже ctrl + f) и проверить - корректный ли XPath для selenium.

    2. Возможно wait_and_click работает не совсем так. Однажды у меня была такая история, когда это ожидание не работало. Голову сломала, но хорошего решения не нашла. Оказалось, самое простое, что могло бы прийти в голову, помогло. Я сделала цикл while и в нём в течение 5-10 секунд пыталась нажать, если не нажимается, а я точно знаю, что такая кнопка на странице есть, то я делала питоновский time sleep(1).
    Проблема была в том, что библиотеки для отработки кнопки прилетали позже, возможно фоном, хотя страница загружена, JS тоже.
    Ответ написан
    Комментировать