Python kodunu parametre olarak kullanmak

Merhaba. Selenium’da " driver.find_element(By.XPATH, “//*[@id=‘resultTable_wrapper’]/div[2]/div/div/div[1]/div/table/thead/tr/th[%d]”%(i+1)).text) " kodunu bir fonksiyona parametre olarak atmak istiyorum. Bunu nasıl yapabilirim?

direkt
parametre = eval(""“str(driver.find_element(By.XPATH, “//*[@id=‘resultTable_wrapper’]/div[2]/div/div/div[1]/div/table/thead/tr/th[%d]”%(i+1)).text)”"")

ya da

parametre =str(driver.find_element(By.XPATH, “//*[@id=‘resultTable_wrapper’]/div[2]/div/div/div[1]/div/table/thead/tr/th[%d]”%(i+1)).text)

olarak kullanınca içindeki kodu çalıştırmaya çalışıyor. Ben içindeki kod parametre olarak gittiği fonksiyona kadar hiçbir yerde çalışmasın,paket olarak oraya taşınsın istiyorum. Gittiği yerde de kendindeki i parametresini ona atanan i parametresi ile eşleştirmeli. Bunu nasıl yaparım?

Anlattıklarınızdan aslında fonksiyon tanımına benzer bir şey anladım. Mesela

def yapilacak_islem(i)
    driver.find_element(By.XPATH, “//*[@id=‘resultTable_wrapper’]/div[2]/div/div/div[1]/div/table/thead/tr/th[%d]”%(i+1)).text)

şeklinde bir fonksiyon tanımlarsanız ve fonksiyonu çağırıp i değeri vermediğiniz sürece hiçbir yerde çalışmaz. Kodun tamamını paylaşıp tam olarak yapmak istediğinizi anlatırsanız daha iyi yardımcı olabiliriz.

İki farklı siteden veri çeken bir selenium uygulamam var. 1. Siteden (afad) ve 2. siteden (ogm) veri çekme fonksiyonlarının kodları tamamen aynı. Aynı işi yapan iki fonksiyon yerine tek fonksiyona parametreler vererek halledebilirim diye düşündüm, fikir buradan çıktı. Normalde bütün değişkenleri string olarak yollamayı planlıyordum ama indexlenmesi gereken değerleri olan stringler işi karıştırdı. Onları bir obje olarak atmaya çalıştım, indisleri veremedim.

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

from selenium.webdriver.common.by import By

from selenium.webdriver.firefox.options import Options

import time

import re

import pandas as pd

import json

import math

#konfigürasyon

options = webdriver.FirefoxOptions()

options.headless = True

driver = webdriver.Firefox(options=options)

i=0

j=0

k=0

class Parametreler:

def __init__(self, isim,icerik,degisken1,degisken2):

    self.isim = isim

    self.icerik = icerik

    self.degisken1 = degisken1

    self.degisken2 = degisken2

site_afad = “SON DEPREMLER

site_ogm = “OGM Orman Yangınları

sayfa_sayisi_afad = “#resultTable_paginate .pagination li”

sayfa_sayisi_ogm = "#ForestFiresTable_paginate ul li a "

baslik_sayisi_afad = “.dataTables_scroll .dataTables_scrollHead .dataTables_scrollHeadInner .dataTable thead th”

baslik_sayisi_ogm = “#ForestFiresTable thead tr th”

baslik_afad = r""“str(driver.find_element(By.XPATH, r”//*[@id=‘resultTable_wrapper’]/div[2]/div/div/div[1]/div/table/thead/tr/th[%d]"%(i+1)).text)"""

baslik_ogm = r""“str(driver.find_element(By.XPATH, “//*[@id=‘ForestFiresTable’]/thead/tr/th[%d]”%(i+1)).text)”""

tablo_satirlari_afad = eval(“driver.find_elements(By.CSS_SELECTOR,’#tbody tr’)”)

tablo_satirlari_ogm = eval(“driver.find_elements(By.CSS_SELECTOR,’#ForestFiresTable tbody tr’)”)

hucre_afad = r""“driver.find_element(By.XPATH,’//*[@id=‘tbody’]/tr[%d]/td[%d]’%((j+1),(k+1)))”""

hucre_ogm = r""“driver.find_element(By.XPATH,’//*[@id=‘ForestFiresTable’]/tbody/tr[%d]/td[%d]’%((j+1),(k+1)))”""

json_afad = “afad-depremler.json”

json_ogm = “ogm-yanginlar.json”

sonraki_afad = r""“driver.find_element(By.XPATH,’//*[@id=‘resultTable_next’]/a’)”""

sonraki_ogm = r""“driver.find_element(By.XPATH, ‘//*[@id=‘ForestFiresTable_next’]/a’)”""

def getir(_site, _sayfa_sayisi, _baslik_sayisi, _baslik, _tablo_satirlari, _hucre, _sonraki, _json):

driver.get(_site)

time.sleep(2)

sayfa_sayisi = driver.find_elements(By.CSS_SELECTOR,_sayfa_sayisi)

sayfa_sayisi = len(sayfa_sayisi)



baslik = ""

basliklar = []

satir = []

hucrelist = []

totalsatir = 0

baslik_sayisi = driver.find_elements(By.CSS_SELECTOR, _baslik_sayisi)

baslik_sayisi = len(baslik_sayisi)

for i in range(baslik_sayisi):

    baslik = _baslik

    basliklar.append(baslik)

######################################

for i in range(sayfa_sayisi):

    print("sayfa " + str(i+1))

    tablo_satirlari = _tablo_satirlari

    satir_sayisi = len(tablo_satirlari)

    totalsatir += satir_sayisi

    for j in range(satir_sayisi):

        hucre_sayisi = baslik_sayisi

        for k in range(baslik_sayisi): #14 idi burası

            hucre = _hucre

            hucre = hucre.text

            hucrelist.append(hucre)

   

    time.sleep(0.5)

    sonraki = _sonraki

    try:

        sonraki.click()

    except:

        pass

for i in range(math.ceil(len(hucrelist)/hucre_sayisi)): #hucre boyutu/kaçlı kaçlı böleceksin bunu ceil et

        satir.append(list(hucrelist[(i*hucre_sayisi):(i*hucre_sayisi)+hucre_sayisi]))

for i in range(totalsatir):#bunu yapmazsak index out of range hatası veriyor #APPEND KULLANILABİLİR Mİ

    satirci = [None]*totalsatir

for i in range(totalsatir):

    satirci[i] = "satir" + str(i+1)

soz = {}

#satır sayısına erişmem lazım ki total satır sayısına göre mapleme yapabileyim

degerlerlist = []

for i in satir: #kaç satır varsa o kadar tekrar etmek zorunda

    degerler = dict(zip(basliklar,i))

    # print(degerler)

    degerlerlist.append(degerler)

    print("\n")

i = 0

for key in satirci:

    soz[key]=degerlerlist[i]

    i += 1

print("AOAOAOAOAAOAOAOAOAOAAO")

# for i in soz:

#     print(i)

#     print(soz[i])

print(soz)

print("AODFKSŞKDFJSLKFLDSKFJSDF")

# for i in satir: #bu satıralarımızı gösteriyor

    # print(i)

# json_object = json.dumps(soz,indent=4)

# json_object = json.dumps(soz,indent=4,ensure_ascii=False).encode("utf-8")

print("jsonumuz budur : \n\n")

# print(json.loads(json_object)) #dümdüz print dersen utf-8 gözükmüyor



with open(_json,"w",encoding="utf-8") as write_file:

    json.dump(soz,write_file,indent=4,ensure_ascii=False)

print("json bitti")

getir(site_afad, sayfa_sayisi_afad, baslik_sayisi_afad, baslik_afad, tablo_satirlari_afad, hucre_afad, sonraki_afad, json_afad)

getir(site_ogm, sayfa_sayisi_ogm, baslik_sayisi_ogm, baslik_ogm, tablo_satirlari_ogm, hucre_ogm, sonraki_ogm, json_ogm)

getir()

Kod bu. Mimari bu şekilde de süper değil biliyorum fakat bu yöntem ile yapabilmek python yeteneklerime katkıda bulunur diye düşünüyorum. Şimdiden teşekkürler

Parametreler class’ını bir şeyler denemek için yazmıştım kalmış, onu dikkate almayın hocam

İki ayrı sitenin kendine göre bir div table başlık vb gibi yapıları çok farklı olacağından dolayı sizin kullandığınız xpath yolları da farklı olacaktır. Bu nedenle tek fonksiyonla iki farklı siteden veri alamazsınız. İlla tek fonksiyonla alacağım derseniz try catch yapısı ile önce birinci siteden veri almak için gerekli kodu yazarsınız veri alamadığı durumda ise ikinci siteden veri alan kodu eklersiniz. Fonksiyon önce birinci ardından ikinci siteden veri almaya çalışacaktır. Bence iki ayrı fonksiyon ile bu işi yapmanız çok daha doğru olacaktır.

Ayrıca kodunuzu kod etiketleri içinde paylaşmadığınız için tırnak sembolleri farklı olarak görünmekte ve girinti çıkıntılar da kodda syntax hatası vermektedir. Bu nedenle kendim çabamla uğraşıp kodu düzenleyip denemek istemedim.

Hic birimiz istemiyoruz.
bkz: Soru Sorarken Sıkça Düşülen Hatalar #1

Guzel bir fikir, fakat bunu yapabilmek icin once ayni isi yapan iki fonksiyonu da yazmak, sonra parametre alan tek fonksiyona donusturmek gerekiyor.

eval bu is icin dogru alet degil. Yukaridaki ornekteki tek satirlik fonksiyon daha uygun.

Burada niye direk ikinci parametre parametre olarak alinmiyor?

hocam, farklı siteler için bu işleri yapan iki ayrı fonksiyonum var zaten. xpath yollarını string şeklinde parametre olarak fonksiyona verince sıkıntı yapmıyor. i ve j indislerinin işin içine girmesi hata oluşturuyor.

xpath yollarını string şeklinde parametre olarak fonksiyona verince sıkıntı yapmıyor. i ve j indislerinin işin içine girmesi hata oluşturuyor hocam

Koda bakmadan bir sey soylemek zor.

Sorun çıkartan index ve operatörlere sahip olaran değerleri r""" “”" içerisine aldıktan sonra çağrıldıkları fonksiyon içerisinde eval ile başka bir değişkene atamak işimi çözdü. ör:

baslik_afad = r""“driver.find_element(By.XPATH, r”//*[@id=‘resultTable_wrapper’]/div[2]/div/div/div[1]/div/table/thead/tr/th[%d]"%(i+1)).text"""

def getir(_baslik):
baslik = eval(_baslik)