Nesne Tabanlı Proglamlamada yaşadığım sorun

Merhaba arkadaşlar.Nesne Tabanlı proglamlamaya yeni başladım ve bu kodu yazdım :

import requests
from bs4 import BeautifulSoup
class Html():
    def __init__(self):
        self.url = ""
        self.etiket = ""
        r = requests.get(self.url)
        soup = BeautifulSoup(r.content,"html.parser")
        soup.find_all(self.etiket)
        print(soup)

ve şuda çağrılışı :

from forum import Html

html = Html()
html.url = "https://tr.wikipedia.org/wiki/Python_(programlama_dili)"
html.etiket = "p"

ve aldığım hata:

C:\Users\tuncaypc\PycharmProjects\Python\venv\Scripts\python.exe C:/Users/tuncaypc/PycharmProjects/Python/NTP.py
Traceback (most recent call last):
  File "C:/Users/tuncaypc/PycharmProjects/Python/NTP.py", line 3, in <module>
    html = Html()
  File "C:\Users\tuncaypc\PycharmProjects\Python\forum.py", line 7, in __init__
    r = requests.get(self.url)
  File "C:\Users\tuncaypc\PycharmProjects\Python\venv\lib\site-packages\requests\api.py", line 76, in get
    return request('get', url, params=params, **kwargs)
  File "C:\Users\tuncaypc\PycharmProjects\Python\venv\lib\site-packages\requests\api.py", line 61, in request
    return session.request(method=method, url=url, **kwargs)
  File "C:\Users\tuncaypc\PycharmProjects\Python\venv\lib\site-packages\requests\sessions.py", line 516, in request
    prep = self.prepare_request(req)
  File "C:\Users\tuncaypc\PycharmProjects\Python\venv\lib\site-packages\requests\sessions.py", line 459, in prepare_request
    hooks=merge_hooks(request.hooks, self.hooks),
  File "C:\Users\tuncaypc\PycharmProjects\Python\venv\lib\site-packages\requests\models.py", line 314, in prepare
    self.prepare_url(url, params)
  File "C:\Users\tuncaypc\PycharmProjects\Python\venv\lib\site-packages\requests\models.py", line 388, in prepare_url
    raise MissingSchema(error)
requests.exceptions.MissingSchema: Invalid URL '': No schema supplied. Perhaps you meant http://?

Process finished with exit code 1

Sebebi ne olabilir

Burda sen objeyi Html() class’ından oluşturduğunda __init__ çalışıyor.

Yani senin url ve etiketi belirtmenden önce zaten __init__ çalıştığı için

Buraya boş bir string göndermiş oluyorsun. Onun yerine url ve etiket i argüman olarak alabilirsin. Burdan devam etmeni öneririm;

class Html():
    def __init__(self, url, etiket):
        self.url = url
        self.etiket = etiket
        r = requests.get(self.url)
        soup = BeautifulSoup(r.content,"html.parser")
        soup.find_all(self.etiket)
        print(soup)
1 Beğeni

Teşekkür ederim yanıtınız sorunumu çözdü.
Konu ile alakasız olucak ama soup değişkenini

dosya = open("dosya.txt","a")
dosya.write()

içine nasıl yazdırabilirim ?

Soup değişkeni derken ne dediğinizi anlamadım. r.text i yazabilirsiniz ama bir python objesini bir dosyaya kaydetmek istiyorsanız bunun için pickle kütüphanesini kullanmalısınız.

1 Beğeni

Soup’u strye dönüştürmeniz lazım.

...
dosya.write(str(soup))

Bunun yerine r.text kullanmaya alışın. text decode edilmiş hali.


Çok güzel bir örnek olmamış ama, sınıf sadece bir fonksiyon gibi çalışıyor sanki.

2 Beğeni

İzninizle nesne tabanlı programlamaya örnek olarak basit bir oyun paylaşayım.

from time import sleep
from random import randint


class Oyuncu:
    oyuncular = []

    def __init__(self, isim: str = "", can: int = 0, guc: int = 0):
        self.isim = isim
        self.can = can
        self.guc = guc
        self.oyuncular.append(self)

    def saldir(self, other: 'Oyuncu'):
        print(f"{self.isim} saldırıyor...")
        if self.guc * randint(0, 1):
            other.saldiriya_ugra(other=self)
        else:
            print(f"{self.isim} ıskaladı.")

    def saldiriya_ugra(self, other: 'Oyuncu'):
        print(f"{self.isim} yaralandı...")
        self.can -= other.guc
        print(f"{self.isim}'in kalan canı: {self.can}")
        if self.can <= 0:
            print(f"{self.isim} öldü.")
            self.oyuncular.remove(self)


def oyun():
    Oyuncu(isim="Zeus", can=100, guc=10)
    Oyuncu(isim="Saturn", can=80, guc=12)
    karsilasma_sayisi = 0
    while len(Oyuncu.oyuncular) == 2:
        saldiran = Oyuncu.oyuncular[randint(0, 1)]
        saldirilan = [i for i in Oyuncu.oyuncular if i != saldiran][0]
        karsilasma_sayisi += 1
        print(f"Karşılaşma sayısı: {karsilasma_sayisi}")
        saldiran.saldir(other=saldirilan)
        sleep(0)
        print()


oyun()
1 Beğeni

Kesinlikle işimi görecek ve daha iyi anlamamı sağlayacak teşekkür ederim