Liste=[]
Liste1=[[a,b,c],[d,e,f]]
Liste2=[[h,i,j],[k,l,m],[n,m,o]]
liste1 ve liste 2 yi sıra numarası vererek listeye append etmek istiyorum.
Liste=[[1,a,b,c],[2,d,e,f],[1,h,i,j],[2,k,l,m],[3,n,m,o]]
Sizce nasıl yapılabilir bu? Nasıl bir algoritma oluştururdunuz? Bildikleriniz kadarıyla aklınıza gelenleri paylaşın, birlikte bakalım.
Aşağıdaki kod ile bir site üzerinden veri çekiyorum.
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://www.hipodromx.com/galop.aspx?Page=1")
sleep(2)
TABLO=[]
for i in range(4, 2, -1):
tab=driver.find_element(By.XPATH,
"//img[@id='ctl00_ContentPlaceHolder1_ASPxPageControl1_cbGalopIstatistikMesafe_B-1Img']")
ActionChains(driver).move_to_element(tab).click().perform()
sleep(2)
sub_tab=driver.find_element(By.XPATH,
"//td[@id='ctl00_ContentPlaceHolder1_ASPxPageControl1_cbGalopIstatistikMesafe_DDD_L_LBI{}T0']".format(i))
ActionChains(driver).move_to_element(sub_tab).click().perform() #Range aralığına göre 1400-1200-1000-800-600-400 e tıklıyor.
sleep(2)
tablo = driver.find_elements(By.XPATH,
"//tr[contains(@id,'ctl00_ContentPlaceHolder1_ASPxPageControl1_grdGalopIstatistik_DXDataRow')]//descendant::td")#mesafeye göre açılan tablodaki bilgileri çekiyor
for i in tablo:
TABLO.append(i.text)
tablo_duzenleme=[TABLO[x:x+10] for x in range(0, len(TABLO), 10)]
print(tablo_duzenleme)
df=pd.DataFrame(tablo_duzenleme, columns=["Tarih","Atadı","Şehir","1200+","1000","800","600","400","G.K","İdman_Jokeyi"])
print(df)
Kod çıktısı:
0 26/02 KATHERİNA AT 39,4 26,4 R O.Öztürk
1 26/02 TETRAGON AT 39,8 26,2 R A.Demirkıran
2 26/02 HAKK HANI AT 50 24,6 R Mur.Aydoğdi
3 26/02 ICE TEA AT 51,4 25,2 R R.Keskin
4 26/02 SHOW MUST GO ON AT 51,6 26,5 R O.Öztürk
5 26/02 STONE ACTIONS AT 52,1 26 R Ç.Canpolat
çıktının aşağıdaki gibi olmasını istiyorum:
0 1-26/02 KATHERİNA AT 39,4 26,4 R O.Öztürk
1 2-26/02 TETRAGON AT 39,8 26,2 R A.Demirkıran
2 1-26/02 HAKK HANI AT 50 24,6 R Mur.Aydoğdi
3 2-26/02 ICE TEA AT 51,4 25,2 R R.Keskin
4 3-26/02 SHOW MUST GO ON AT 51,6 26,5 R O.Öztürk
5 4-26/02 STONE ACTIONS AT 52,1 26 R Ç.Canpolat
for i in range(4, 2, -1):
döngüsünün 1. adımında TABLO
'ya eklenen değerleri bir görelim:
for i in tablo:
TABLO.append(i.text)
print(TABLO)
TABLO`'nun içine baktığımızda şöyle değerlerle karşılaşıyoruz:
['26/02', 'GANANDO SOLO', 'İS', ' ', ' ', ' ', '37', '24,3', 'R', 'A.Tekdemir', '26/02', 'BRONZE HILL', 'İZ', ' ', ' ', ' ', '39', '26', 'R', 'A.C.İnan', '26/02', 'KATHERİNA', 'AT', ' ', ' ', ' ', '39,4', '26,4', 'R', 'O.Öztürk', '26/02', 'DONNA', 'İZ', ' ', ' ', ' ', '39,4', '26,6', 'R', 'H.Tunç', '26/02', 'SIRDERYA', 'İS', ' ', ' ', ' ', '39,5', '26,5', 'R', 'M.A.Aktürk', '26/02', 'TETRAGON', 'AT', ' ', ' ', ' ', '39,8', '26,2', 'R', 'A.Demirkıran', '26/02', 'BRIGHT', 'İS', ' ', ' ', ' ', '40,6', '27', 'R', 'R.Arslan', '26/02', 'NORTHSHIELD', 'İS', ' ', ' ', ' ', '41', '26,2', 'R', 'B.Aktaş', '26/02', 'PLEINE LUNE', 'İS', ' ', ' ', ' ', '42,8', '28,8', 'R', 'Ö.Gönültaş']
Şimdi, sizin yazdığınız kodlara göre bu listenin ilk elemanı '26/02'
gibi tarih verisini simgeleyen bir string ve listenin içinde bir çok kez tekrar etmiş. Kaç kez tekrar ettiğini bulmaya çalışacağız.
O halde,
for i in tablo:
TABLO.append(i.text)
print(TABLO)
ifadesini biraz değiştirmemiz gerekiyor:
for i in range(4, 2, -1):
# Selenium işlemleri...
[...]
# Dıştaki döngünün her bir adımında say'ın değeri sıfırlanacak ve
# sayma işlemi yeniden başlatılacak.
say = 0
# Her bir tablo bir sayfadan çekilen değişik sayıdaki satır verilerini içeriyor.
# Dolayısıyla tablo içindeki satır sayısı belli.
# Bizim sadece tarihlerin başına satır sıra numaralarını eklememiz lazım.
for i in tablo:
# Eğer TABLO yoksa veya TABLO var ve i.text TABLO[0]'ın içindeyse:
if not TABLO or (TABLO and i.text in TABLO[0]):
say += 1
text = f"{say}-{i.text}"
else:
text = i.text
TABLO.append(text)
Çıktı:
Tarih Atadı Şehir 1200+ ... 600 400 G.K İdman_Jokeyi
0 1-26/02 GANANDO SOLO İS ... 37 24,3 R A.Tekdemir
1 2-26/02 BRONZE HILL İZ ... 39 3-26 R A.C.İnan
2 4-26/02 KATHERİNA AT ... 39,4 26,4 R O.Öztürk
3 5-26/02 DONNA İZ ... 39,4 26,6 R H.Tunç
4 6-26/02 SIRDERYA İS ... 39,5 26,5 R M.A.Aktürk
5 7-26/02 TETRAGON AT ... 39,8 26,2 R A.Demirkıran
6 8-26/02 BRIGHT İS ... 40,6 27 R R.Arslan
7 9-26/02 NORTHSHIELD İS ... 41 26,2 R B.Aktaş
8 10-26/02 PLEINE LUNE İS ... 42,8 28,8 R Ö.Gönültaş
9 1-26/02 HAKK HANI AT ... 24,6 R Mur.Aydoğdi
10 2-26/02 ICE TEA AT ... 25,2 R R.Keskin
11 3-26/02 SHOW MUST GO ON AT ... 26,5 R O.Öztürk
12 4-26/02 FLAWLESS POWER İS ... 26,5 R Ş.Dursun
13 5-26/02 STONE ACTIONS AT ... 6-26 R Ç.Canpolat
14 7-26/02 FOREVER JUSTEN İZ ... 26,6 R A.C.İnan
15 8-26/02 OĞUZUN RÜYASI AD ... 26,8 ÇR A.E.Tülek
16 9-26/02 BABA RUNNER İZ ... 27,5 R R.Canpolat
Açıklamanız çok güzel ve anlaşılır teşekkür ederim. Ancak bazı sıra numaralarını atlıyor.Aslında derecede 26 sayısını gördüğünde onlara da sıra numarası koyuyor Birde
f"{say}-{i.text}" kullanımını ilk defa görüyorum. Bu ne anlama geliyor. daha doğrusu başındaki f.
Evet, kaçırıyor çünkü sorgumuz biraz ilkel. Sorguyu biraz daha detaylandırmak gerekiyor.
Mesela re
kütüphanesini böyle bir örnekte kullanabilirsiniz.
Düzenli ifadeler hakkında daha fazla bilgi için aşağıdaki bağlantıyı inceleyin:
22/22
ifadesi rakam
+ rakam
+ "/"
+ rakam
+ rakam
gibi bir örüntüye sahip.
Şöyle bir fonksiyon tanımlıyorum:
def has_pattern(string, pattern):
return re.compile(pattern).match(string)
Sorguyu da şu şekilde değiştiriyorum:
say = 0
for i in tablo:
if has_pattern(i.text, r"^\d{2}/\d{2}$"):
say += 1
text = f"{say}-{i.text}"
else:
text = i.text
TABLO.append(text)
Buna göre aldığım çıktı şöyle oluyor:
Tarih Atadı Şehir 1200+ ... 600 400 G.K İdman_Jokeyi
0 1-26/02 GANANDO SOLO İS ... 37 24,3 R A.Tekdemir
1 2-26/02 DEE MARK AD ... 38,8 25,7 R M.G.Arslan
2 3-26/02 MUSHARRAF AD ... 38,8 25,7 R Serkan Yıldız
3 4-26/02 BRONZE HILL İZ ... 39 26 R A.C.İnan
4 5-26/02 KATHERİNA AT ... 39,4 26,4 R O.Öztürk
5 6-26/02 DONNA İZ ... 39,4 26,6 R H.Tunç
6 7-26/02 SIRDERYA İS ... 39,5 26,5 R M.A.Aktürk
7 8-26/02 ANGEL OF THE SOUTH AD ... 39,6 26,2 R R.Bayram
8 9-26/02 HEART BRIDE AD ... 39,6 26,2 R E.Çankaya
9 10-26/02 TETRAGON AT ... 39,8 26,2 R A.Demirkıran
10 11-26/02 BRIGHT İS ... 40,6 27 R R.Arslan
11 12-26/02 NORTHSHIELD İS ... 41 26,2 R B.Aktaş
12 13-26/02 PLEINE LUNE İS ... 42,8 28,8 R Ö.Gönültaş
13 1-26/02 HAKK HANI AT ... 24,6 R Mur.Aydoğdi
14 2-26/02 ICE TEA AT ... 25,2 R R.Keskin
15 3-26/02 SHOW MUST GO ON AT ... 26,5 R O.Öztürk
16 4-26/02 FLAWLESS POWER İS ... 26,5 R Ş.Dursun
17 5-26/02 STONE ACTIONS AT ... 26 R Ç.Canpolat
18 6-26/02 AKUANDA AD ... 26,5 R K.Yiğit
19 7-26/02 FOREVER JUSTEN İZ ... 26,6 R A.C.İnan
20 8-26/02 OĞUZUN RÜYASI AD ... 26,8 ÇR A.E.Tülek
21 9-26/02 BABA RUNNER İZ ... 27,5 R R.Canpolat
Stringin başındaki f, fstring demek, stringi biçimlendirmeye yarıyor. Değişik string biçimlendirme yöntemleri var:
a = "merhaba"
b = "dünya"
print(a + b)
print(f"{a}{b}")
print("{}{}".format(a, b))
print("%s%s" % (a, b))
Bu biçimlendirme yöntemleri aynı çıktıları üretiyorlar.
herhangi bir tablo boş olduğunda da çalışacaktır değil mi.
Bu yeni sorguda i.text
'in TABLO[0]
'ın içinde olup olmadığına bakmıyoruz. i.text
'in 26/23
gibi bir örüntüsü var mı ona bakıyoruz. 50/98
ifadesi mesela bu örüntüye uyar. Ama bu örüntüye uyan tarih dışında başka bir hücre değeri olmadığı için has_pattern
fonksiyonu sadece i.text
26/23
olduğunda True
değerini verecektir. Kaçıncı kez True
değerini aldığımız da say
ile belirlenecek. say
değişkeni de kaç tane tablo
varsa o kadar kez sıfırlanır ve saymaya baştan başlanır.