String kısaltma

Selamlar,

[<div class="P6K39c">₺3.33</div>, <div class="P6K39c">₺3.39 - ₺3.57</div>, <div class="P6K39c">₺1.59 - ₺3.57</div>, <div class="P6K39c">16.20B TRY</div>, <div class="P6K39c">4.08M</div>, <div class="P6K39c">7.93</div>, <div class="P6K39c">0.09%</div>, <div class="P6K39c">IST</div>, <div class="P6K39c">2016</div>, <div class="P6K39c"><a class="tBHE4e" href="https://www.google.com/maps/place/Turkey?hl=en-US" target="_blank">Turkey</a></div>, <div class="P6K39c"><a class="tBHE4e" href="http://www.ziraatgyo.com.tr/" rel="noopener noreferrer" target="_blank">ziraatgyo.com.tr</a></div>, <div class="P6K39c">35</div>]

Benzeri uzun bir dizim var. Benim burada sadece 5. virgülden sonraki <div class="P6K39c">7.93</div> bölüme ihtiyacım var (aslında sadece 7.93 lazım)

Aklıma ilk gelen split() ile virgülden bölüp yeni liste üretmek oldu (kulağımı tersten gösteriyor da olabilirim bilmiyorum)

ilk aldığım hata

a=[<div class="P6K39c">₺3.33</div>, <div class="P6K39c">3.39 - 3.57</div>, <div class="P6K39c">1.59 - 3.57</div>, <div class="P6K39c">16.20B TRY</div>, <div class="P6K39c">4.08M</div>, <div class="P6K39c">7.93</div>, <div class="P6K39c">0.09%</div>, <div class="P6K39c">IST</div>, <div class="P6K39c">2016</div>, <div class="P6K39c"><a class="tBHE4e" href="https://www.google.com/maps/place/Turkey?hl=en-US" target="_blank">Turkey</a></div>, <div class="P6K39c"><a class="tBHE4e" href="http://www.ziraatgyo.com.tr/" rel="noopener noreferrer" target="_blank">ziraatgyo.com.tr</a></div>, <div class="P6K39c">35</div>]
yeni=a.split(",")

SyntaxError: invalid character '₺' (U+20BA) oldu. Hadi bunu elle sildim diyelim (500 civarı satır var onun için de bir yöntem bulmak lazım ama vakit kaybetmemek amacıyla ilkini elle sildim) bu kez SyntaxError: invalid decimal literal hatası verdi. Hatayı google’a sorduğumda değişken rakamla başlamaz gibi sonuçlar geldi ki benim değişkenlerde rakam yok :smiley:

bu sorunu nasıl çözebilirim?

a zaten bir liste değil mi, endeks kullanırsanız sorununuz çözülür gibi duruyor.

a = [...]
gerekli_yazi = a[4].text

HTMLParser sınıfını denediniz mi ?

from html.parser import HTMLParser

a = ['<div class="P6K39c">₺3.33</div>', '<div class="P6K39c">₺3.39 - ₺3.57</div>', '<div class="P6K39c">₺1.59 - ₺3.57</div>', 
     '<div class="P6K39c">16.20B TRY</div>', '<div class="P6K39c">4.08M</div>', '<div class="P6K39c">7.93</div>', '<div class="P6K39c">0.09%</div>', 
     '<div class="P6K39c">IST</div>', '<div class="P6K39c">2016</div>', 
     '<div class="P6K39c"><a class="tBHE4e" href="https://www.google.com/maps/place/Turkey?hl=en-US" target="_blank">Turkey</a></div>', 
     '<div class="P6K39c"><a class="tBHE4e" href="http://www.ziraatgyo.com.tr/" rel="noopener noreferrer" target="_blank">ziraatgyo.com.tr</a></div>', 
     '<div class="P6K39c">35</div>']

class Parser(HTMLParser):
    def __init__(self, parsestring:list[str]) -> None:
        self.storage = []
        super().__init__()
        for i in parsestring:
            self.feed(i)
    
    def handle_data(self, data: str) -> None:
        self.storage.append(data)

if __name__ == "__main__":
    print(Parser(a).storage)

htmlparser sınıfını miras aldım. Ardından text verilerini alabilmek için pythonun sitesine gidip baktığımda html.parser — Simple HTML and XHTML parser — Python 3.10.6 documentation Böyle bir örneği gördüm. İnceledim ve text verilerine ulaşabildim.

Yaptığım iki şey var. İlki feed methodu ile ilgili veriyi miras aldığımız sınıfa bildirmek. İkincisi ise miras olarak aldığımız sınıftan handle_data methodunu kullanarak text verisini ayrıştırıp yeni bir listeye eklemek.

Çıktı:

['₺3.33', '₺3.39 - ₺3.57', '₺1.59 - ₺3.57', '16.20B TRY', '4.08M', '7.93', '0.09%', 'IST', '2016', 'Turkey', 'ziraatgyo.com.tr', '35']
2 Beğeni

Teşekkür ederim.

Bu da güzel bir çözüm ancak şöyle bir sıkıntısı var. Siz anladığım kadarıyla elemanların başına elle ' ' eklemişsiniz. tek satır için ok ama bundan 500 satır olunca iş biraz daha komplike bir hale geliyor.

bu diziyi aşağıdaki gibi oluşturuyordum ve ufak bir eklentiyle (@Alih78 in de değindiği gibi) sonuca biraz daha yaklaştırdım.

liste=[]
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
response=requests.get(url,headers=headers)
html_icerigi=response.content
corba=BeautifulSoup(html_icerigi, "html.parser")


for i in kodlar:
    url="https://www.google.com/finance/quote/"+i.replace('.IS','')+":IST"
    print(url)
    
    fk=corba.find_all("div", {'class':"P6K39c"})[5]
    
    if fk == "N/A":
        fk=""
    print(fk)

   liste.append([deger])

buradan

https://www.google.com/finance/quote/ANHYT:IST
<div class="P6K39c">7.92</div>

şeklinde sonuç geliyor. <div class="P6K39c"> ve </div> tag lerinden nasıl kurtarabilirim?

Siz zaten

Diyerek bir liste içerisine alıp komplike haline getiriyorsunuz.

Evet çünkü En başta herhangi bir bilgi vermediniz. Şu modüller kullanıldı şunu yapmaya çalışıyorum vs… Hatta sizin örnek olarak verdiğiniz a listesi buraya yapıştırırken gözden kaçan ' ' arasındaki elemanlar.

Bellekten dolayı bir sıkıntı yaşayacağınızı düşünüyorsanız bunu bir generator oluşturarak düşüncenizden kurtulabilirsiniz. Hatta oluşturmanıza gerek yok çünkü Handle_data methodu bir generatorü çağırarak işlem yapıyor o yüzden herhangi olumsuz düşünceye sapmayın.

fk değişkenini üstte oluşturduğum sınıfa parametre olarak verin.

Diğer işlemler içinde htmlparser sınıfını kullanın işiniz çok daha kolaylaşacaktır.

Eğer kullanmak istemiyorsanız siz kendiniz parse ederek işlem yapmanız gerekiyor. Atıyorum <div ile başlıyor </div> ile bitiyorsa bunu belirtip aradaki diğer belirteçleri de ortadan kaldırarak parse edebilirsiniz. startswith, endswith, split gibi methodlara göz atın.

1 Beğeni

Aslında burada da çözüm @Arif_RYG in verdiği örnekte. Bunun içine html parser girince iş çözülüyor :slight_smile:

Destekler için teşekkür ederim

2 Beğeni

Aldığınız html parçası string olarak gelmiyor, BeautifulSoupun kendine özel bir veri türü olarak geliyor. Bundan dolayı bu türün text özelliğini kullanabilirsiniz. En azından bende sıkıntısız çalışıyor. Sizde çalışmıyor mu bilemedim.

a.text