Python requests: ошибка Invalid URL '0': No scheme supplied

Я получил ошибку в работе requests:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\Artyom\AppData\Local\Programs\Python\Python311\Lib\tkinter\__init__.py", line 1948, in __call__
    return self.func(*args)
           ^^^^^^^^^^^^^^^^
  File "C:\Users\Artyom\PycharmProjects\pythonProject2\main.py", line 40, in parsing
    info = requests.get(s)
           ^^^^^^^^^^^^^^^
  File "C:\Users\Artyom\PycharmProjects\pythonProject2\venv\Lib\site-packages\requests\api.py", line 73, in get
    return request("get", url, params=params, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Artyom\PycharmProjects\pythonProject2\venv\Lib\site-packages\requests\api.py", line 59, in request
    return session.request(method=method, url=url, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Artyom\PycharmProjects\pythonProject2\venv\Lib\site-packages\requests\sessions.py", line 573, in request
    prep = self.prepare_request(req)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Artyom\PycharmProjects\pythonProject2\venv\Lib\site-packages\requests\sessions.py", line 484, in prepare_request
    p.prepare(
  File "C:\Users\Artyom\PycharmProjects\pythonProject2\venv\Lib\site-packages\requests\models.py", line 368, in prepare
    self.prepare_url(url, params)
  File "C:\Users\Artyom\PycharmProjects\pythonProject2\venv\Lib\site-packages\requests\models.py", line 439, in prepare_url
    raise MissingSchema(
requests.exceptions.MissingSchema: Invalid URL '0': No scheme supplied. Perhaps you meant http://0?

Я новичок в программировании и не понимаю, что здесь не правильно. Почему появляется ошибка?

Мой код:

from tkinter import *
from tkinter import ttk
import requests
from bs4 import BeautifulSoup

# Переменные которые используются в radiobuttons
yep = 'yes'
nope = 'no'

s = 0
c = 0
q = 0
t = 0

# Получение данных

def ac():
    global url
    global clas
    global amo
    global r_var
    global s
    global c
    global q
    global t
    s = str(url.get())
    c = str(clas.get())
    q = int(amo.get())
    t = str(r_var.get())
    print(s)
    print(c)
    print(q)
    print(t)

# Функция которая парсит сайты

def parsing():
    global s
    global c
    global q
    global t

    a = 1
    info = requests.get(s)
    info = info.content
    html = BeautifulSoup(info, 'html.parser')
    cards = html.find_all(info, class_=c)

    if a == 1:
        for card in cards:
            res = html.find_all(c)[card]
            print(res.text)
            print(
                '-----------------------------------------------------------------------------------------------------------')
    if r_var == 'no':
        for i in range(0, q):
            res = html.find_all(c)[card]
            print(res)
            print(
                '-----------------------------------------------------------------------------------------------------------')

# Переключение на английский
def en_lang():
    global button
    global savebutton
    global lr
    global q1
    global q2
    global q3
    global q4
    global y
    global n
    button['text'] = 'Go'
    lr['text'] = 'Result:'
    q1['text'] = 'Site address (with https!):'
    q2['text'] = 'Desired class:'
    q3['text'] = 'Amount of elements:'
    q4['text'] = 'Seize only text:'
    y['text'] = 'yes'
    n['text'] = 'no'
    savebutton['text'] = 'Save as txt file'

# переключение на русский
def ru_lang():
    global button
    global savebutton
    global lr
    global q1
    global q2
    global q3
    global q4
    global y
    global n
    button['text'] = 'Начать'
    lr['text'] = 'Результат:'
    q1['text'] = 'Адресс сайта (c https!):'
    q2['text'] = 'Искомый класс:'
    q3['text'] = 'Количество элементов:'
    q4['text'] = 'Изымать только текст:'
    y['text'] = 'да'
    n['text'] = 'нет'
    savebutton['text'] = 'Сохранить как файл txt'

# Кнопки переключения языка
def lang():
    RU = Button(text='RU', fg='#ededed', bg='#226F54', font=('Roman', 18), command=ru_lang)
    EN = Button(text='EN', fg='#ededed', bg='#226F54', font=('Roman', 18), command=en_lang)
    RU.place(x=440, y=15, width=30, height=40)
    EN.place(x=470, y=15, width=30, height=40)

def save(): # Ещё не использовал как хотел, временно использовал для показа переменных
    global y
    global t
    print(t)

# Окно
window = Tk()
window.geometry('500x580')
window.title('Parser for light sites')
window.resizable(width=False, height=False)
window.config(bg='#ededed')
# Надпись
text = Label(text='Parser for light sites', fg='#ededed', bg='#226F54', font=('Impact', 34))
text.pack(side=TOP, fill=X)
lang()
# Остальные виджеты
savebutton = ttk.Button(text='Save as txt file', command=ac)
savebutton.place(x=340, y=545)
button = ttk.Button(text='Go', cursor='hand2', command=parsing)
button.pack(side=BOTTOM, fill=X, pady=10, padx=220)
inf = Text(window, width=53, height=6, bg='#c9c9c9', font='14')
inf.pack(side=BOTTOM, anchor=SW)
scroll = ttk.Scrollbar(command=inf.yview)
scroll.place(x=480, y=424, width=20, height=111)
inf.config(yscrollcommand=scroll.set)
lr = Label(text='Result:', bg='white')
lr.pack(side=BOTTOM, anchor=NW)
q1 = Label(text='Site address (with https!):')
q2 = Label(text='Desired class:')
q3 = Label(text='Amount of elements:')
q4 = Label(text='Seize only text:')
q4.pack(side=BOTTOM, anchor=NW, pady=22)
q3.pack(side=BOTTOM, anchor=NW, pady=22)
q2.pack(side=BOTTOM, anchor=NW, pady=22)
q1.pack(side=BOTTOM, anchor=NW, pady=22)
url = ttk.Entry()
url.place(x=140, y=162, width=300)
clas = ttk.Entry()
clas.place(x=140, y=230, width=300)
amo = ttk.Spinbox(from_=1.0, to=9999999999999999999.0, increment=1)
amo.place(x=140, y=295)
r_var = StringVar(value=yep)
r_var.set(0)
y = ttk.Radiobutton(text='yes', value=yep, variable=r_var)
n = ttk.Radiobutton(text='no', value=nope, variable=r_var)
y.place(x=140, y=360)
n.place(x=200, y=360)

window.mainloop()

Ответы (1 шт):

Автор решения: Сергей Кох

У вас в функции парсинга нет получения аргументов из полей, скорей всего поэтому вылетала ошибка, так как адрес был 0. Добавил в поля enter вставку скопированного адреса и класса. Запускал на пробу, текст сайта получает, но пока ничего не находит, ещё надо дорабатывать. Переменные лучше называйте словами, а не буквами. Удачи.

from tkinter import *
from tkinter import ttk
import requests
from bs4 import BeautifulSoup

# Переменные которые используются в radiobuttons
yep = 'yes'
nope = 'no'
flag = False
s, c, q, t = 0, 0, 0, 0


# Получение данных

def ac():
    global url, clas, amo, r_var
    global s, c, q, t
    s = str(url.get())
    c = str(clas.get())
    q = int(amo.get())
    t = str(r_var.get())


# Функция которая парсит сайты

def parsing():
    global s, c, q, t
    s = str(url.get())
    c = str(clas.get())
    q = int(amo.get())
    t = str(r_var.get())
    print(s, c, q, t)
    a = 1
    info = requests.get(s)
    info = info.text
    print(info)
    html = BeautifulSoup(info, 'html.parser')
    cards = html.find_all(info, class_=c)
    print(cards)
    if a == 1:
        for card in cards:
            res = html.find_all(c)[card]
            print(res.text)
            print(
                '-----------------------------------------------------------------------------------------------------------')
    if r_var == 'no':
        for i in range(0, q):
            res = html.find_all(c)[card]
            print(res)
            print(
                '-----------------------------------------------------------------------------------------------------------')


# Переключение на английский
def en_lang():
    global button, savebutton
    global lr, q1, q2, q3, q4
    global y, n
    button['text'] = 'Go'
    lr['text'] = 'Result:'
    q1['text'] = 'Site address (with https!):'
    q2['text'] = 'Desired class:'
    q3['text'] = 'Amount of elements:'
    q4['text'] = 'Seize only text:'
    y['text'] = 'yes'
    n['text'] = 'no'
    savebutton['text'] = 'Save as txt file'


# переключение на русский
def ru_lang():
    global button, savebutton
    global lr, q1, q2, q3, q4
    global y, n
    button['text'] = 'Начать'
    lr['text'] = 'Результат:'
    q1['text'] = 'Адресс сайта (c https!):'
    q2['text'] = 'Искомый класс:'
    q3['text'] = 'Количество элементов:'
    q4['text'] = 'Изымать только текст:'
    y['text'] = 'да'
    n['text'] = 'нет'
    savebutton['text'] = 'Сохранить как файл txt'


# Кнопки переключения языка
def lang():
    RU = Button(text='RU', fg='#ededed', bg='#226F54', font=('Roman', 18), command=ru_lang)
    EN = Button(text='EN', fg='#ededed', bg='#226F54', font=('Roman', 18), command=en_lang)
    RU.place(x=440, y=15, width=30, height=40)
    EN.place(x=470, y=15, width=30, height=40)


def save():  # Ещё не использовал как хотел, временно использовал для показа переменных
    global y
    global t
    print(t)


# Чтоб не было многократной вставки из буфера обмена устанавливаем флаг.
def insert_eng(e):
    global flag
    if not flag:
        flag = True
        textbox = e.widget
        textbox.delete(0, 'end')
        clipboard_data = window.selection_get(selection='CLIPBOARD')
        textbox.insert(0, clipboard_data)


# Для русской раскладки клавиатуры проверяем не нажаты ли клавиши "ctrl-V"
def insert_rus(e):
    global flag
    if e.state & 4 > 0 and chr(e.keycode) == 'V' and not flag:
        insert_eng(e)

# Разрешаем вставку из буфера после отпускания кнопок.
def flag_reset(e):
    global flag
    flag = False


# Окно
window = Tk()
window.geometry('500x580')
window.title('Parser for light sites')
window.resizable(width=False, height=False)
window.config(bg='#ededed')
# Надпись
text = Label(text='Parser for light sites', fg='#ededed', bg='#226F54', font=('Impact', 34))
text.pack(side=TOP, fill=X)
lang()
# Остальные виджеты
savebutton = ttk.Button(text='Save as txt file', command=ac)
savebutton.place(x=340, y=545)
button = ttk.Button(text='Go', cursor='hand2', command=parsing)
button.pack(side=BOTTOM, fill=X, pady=10, padx=220)
inf = Text(window, width=53, height=6, bg='#c9c9c9', font='14')
inf.pack(side=BOTTOM, anchor=SW)
scroll = ttk.Scrollbar(command=inf.yview)
scroll.place(x=480, y=424, width=20, height=111)
inf.config(yscrollcommand=scroll.set)
lr = Label(text='Result:', bg='white')
lr.pack(side=BOTTOM, anchor=NW)

q1 = Label(text='Site address (with https!):')
q2 = Label(text='Desired class:')
q3 = Label(text='Amount of elements:')
q4 = Label(text='Seize only text:')
q4.pack(side=BOTTOM, anchor=NW, pady=22)
q3.pack(side=BOTTOM, anchor=NW, pady=22)
q2.pack(side=BOTTOM, anchor=NW, pady=22)
q1.pack(side=BOTTOM, anchor=NW, pady=22)

url = ttk.Entry()
url.place(x=140, y=162, width=300)
url.insert(0, 'To paste press "ctrl-V"')
url.bind('<Key>', insert_rus)
url.bind('<KeyRelease>', flag_reset)

clas = ttk.Entry()
clas.place(x=140, y=230, width=300)
clas.insert(0, 'To paste press "ctrl-V"')
clas.bind('<Key>', insert_rus)
clas.bind('<KeyRelease>', flag_reset)

amo = ttk.Spinbox(from_=1.0, to=9999999999999999999.0, increment=1)
amo.place(x=140, y=295)
r_var = StringVar(value=yep)
r_var.set(0)
y = ttk.Radiobutton(text='yes', value=yep, variable=r_var)
n = ttk.Radiobutton(text='no', value=nope, variable=r_var)
y.place(x=140, y=360)
n.place(x=200, y=360)

window.mainloop()
→ Ссылка