Ответы пользователя по тегу Python
  • Как разделить значения на списки?

    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 комментария
  • Где ошибка в написании программы по нахождению одинаковых цифр числе?

    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
    Ну если у вас текст выглядит как
    '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)
    Ответ написан
    Комментировать
  • Как нажать на кнопку "см. ещё" в вакансиях 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 тоже.
    Ответ написан
    Комментировать