Replace işlemini bir türlü yapmıyor ? Çözemedim

S.a. arkadaşlar,

Aşağıdaki şekilde kodlarım var.

with open('useragent.txt','r+') as y:
        h = y.readlines()
        useragent = random.choice(h)
user = useragent.replace("\n","")
headers = {}
headers['User-Agent'] = user

q = requests.get(urllib.parse.unquote(url),headers=headers,allow_redirects=True)
soup = BeautifulSoup(q.content,"html.parser")

for a in soup.findAll('div',{'class': 'iframeContainer'}):
    for i in a.findAll('iframe'):
        link = mediabaglanti(i["src"])
        re.sub('<div class="iframeContainer">(.*?)<\/div>',str(link),str(a),flags = re.IGNORECASE)

result = str(soup)
print(result)

Çıktı aldığımda aranan yerlerin değişmediğini görüyorum.Bir mantık hatası yapıyorum ama çözemedim ? re.sub kısmını bir değişkene veya bir boş listeye aktarmaya çalıştım. Bu seferde üst üste eklendiğinden çok fazla tekrar ediyor.

Kodun calismiyor (import'lar eksik, url tanimlanmamis, gerisine bakmadim) ama re.sub'un dondurdugu degeri kullanmadigin icin olabilir mi?

Hocam yüzlerce satır kod var. Kafanızı karıştırmak istemem. Zaten düz mantıkta kod yazan birisiyim. importlar en üstte kalıyor. Benim merak ettiğim re.sub a atama yaptığımda en son değeri değiştiriyor. Bir boş listeye aktardığımda ise aynı kaynak kodunu defalarca yazıdıryor. For içinde olduğundan. Bu tarz durumlarda ne yapacağımı bilmiyorum açıkcası.

Şöyle yapalım o zaman, for a in soup.findAll('div',{'class': 'iframeContainer'}) buradan nasıl bir veri elde ediyorsunuz, birkaç tanesini paylaşın. Sonra for i in a.findAll('iframe'): ifadesiyle nasıl bir veri alıyorsunuz bunu da paylaşın, link değişkenindeki string ifadesi nasıl ona bir bakalım. Yani bütün kodları atmanıza gerek yok. Sorun oluşturan kısmı açık bir hale getirin ki biz de görebilelim yoksa biz bu kodlardan sorunun nereden kaynaklandığını göremeyiz çünkü aldığınız veriyi bilmiyoruz.

Edit: ayrıca @aib’in de dediği gibi re.sub yaptığınız veriyi kullanmıyorsunuz.

[quote=“echoyilmaz, post:1, topic:5650”]
Buyurun hocam,

<div class="iframeContainer"><iframe allowfullscreen="" data-media-id="8f8d922ab171cff4a70e334c1cc075a4" frameborder="0" height="250" src="https://*****.com/media/8f8d922ab171cff4a70e334c1cc075a4?postId=fffa11509f28" width="700"></iframe></div>
<iframe allowfullscreen="" data-media-id="8f8d922ab171cff4a70e334c1cc075a4" frameborder="0" height="250" src="https://*****.com/media/8f8d922ab171cff4a70e334c1cc075a4?postId=fffa11509f28" width="700"></iframe>
<div class="iframeContainer"><iframe allowfullscreen="" data-height="480" data-media-id="42de5f2a9a86208d9c1d6c9879edf9b3" data-width="854" frameborder="0" height="393" src="https://*****.com/media/42de5f2a9a86208d9c1d6c9879edf9b3?postId=fffa11509f28" width="700"></iframe></div>
<iframe allowfullscreen="" data-height="480" data-media-id="42de5f2a9a86208d9c1d6c9879edf9b3" data-width="854" frameborder="0" height="393" src="https://****.com/media/42de5f2a9a86208d9c1d6c9879edf9b3?postId=fffa11509f28" width="700"></iframe>

Bu kısımları değiştirmeye çalışıyorum. Link değişkenindeki string ifadeleri twitter ve youtube linkleri hocam.

Peki str(link) nasıl bir veri?

String bir veri hocam. youtube ve twitter url leri taşıyor.

Zaten dogrusu soru sorarken problemin temelini gosteren, mumkun oldugunca kucuk ama calisan bir kod parcasi kullanmak.

Mesela burada “dur simdi, request’lerle ugrasmayayim” diyip link ve a’yi sabit birer ornek olarak verseydin:

import re

a = "..."
link = "..."
re.sub('<div class="iframeContainer">(.*?)<\/div>',str(link),str(a),flags = re.IGNORECASE)
print(link)

Sorunun kaynagini muhtemelen kendin de gorebilirdin.


Genelde insanlar bu noktada aliniyor, ama kullandigin dilin de benzer bir etkisi var:

re.sub’a atama (re.sub = ...) yapmiyorsun, re.sub fonksiyonunu cagiriyorsun.

Neyi aktariyorsun? Hangi kaynak kodunu yazdiriyor?


Bakiniz, hemen ilk konuya bagliyorum:

Hani, nerede? Kodunu gorseydik yardim edebilirdik, simdi yapmaya calistigin ve ortada kaniti olmayan bir seyin ne oldugunu tahmin etmeye calisiyoruz. Dogru tahmin edebilirsek, cozumu de dogru tahmin etme sansimiz olacak.

Şöyle bir yol tarif etmeye çalışayım size, siz bu kodları kendinize göre düzenleyin olur mu? Eldeki verilerle başka türlü nasıl yardımcı olabiliriz bilmiyorum.

import re

text = [
    """<div class="iframeContainer"><iframe allowfullscreen="" data-media-id="8f8d922ab171cff4a70e334c1cc075a4" frameborder="0" height="250" src="https://*****.com/media/8f8d922ab171cff4a70e334c1cc075a4?postId=fffa11509f28" width="700"></iframe></div>
<iframe allowfullscreen="" data-media-id="8f8d922ab171cff4a70e334c1cc075a4" frameborder="0" height="250" src="https://*****.com/media/8f8d922ab171cff4a70e334c1cc075a4?postId=fffa11509f28" width="700"></iframe>""",
    """<div class="iframeContainer"><iframe allowfullscreen="" data-height="480" data-media-id="42de5f2a9a86208d9c1d6c9879edf9b3" data-width="854" frameborder="0" height="393" src="https://*****.com/media/42de5f2a9a86208d9c1d6c9879edf9b3?postId=fffa11509f28" width="700"></iframe></div>
<iframe allowfullscreen="" data-height="480" data-media-id="42de5f2a9a86208d9c1d6c9879edf9b3" data-width="854" frameborder="0" height="393" src="https://****.com/media/42de5f2a9a86208d9c1d6c9879edf9b3?postId=fffa11509f28" width="700"></iframe>"""
]

for i, j in enumerate(text):
    text[i] = re.sub('<div class="iframeContainer">(.*?)<\/div>', replace[i], text[i])
    print(text[i])

Çıktı:

www.link1.com
<iframe allowfullscreen="" data-media-id="8f8d922ab171cff4a70e334c1cc075a4" frameborder="0" height="250" src="https://*****.com/media/8f8d922ab171cff4a70e334c1cc075a4?postId=fffa11509f28" width="700"></iframe>
www.link2.com
<iframe allowfullscreen="" data-height="480" data-media-id="42de5f2a9a86208d9c1d6c9879edf9b3" data-width="854" frameborder="0" height="393" src="https://****.com/media/42de5f2a9a86208d9c1d6c9879edf9b3?postId=fffa11509f28" width="700"></iframe>

Kodu parcalara ayirip dusunebilmen / inceleyebilmen / sorabilmen lazim.

Su 4 satir neyi amacliyor mesela.
Hangi datada nasil degisiklikler yapmasi lazim.
Cozumu 1 hafta sonra gelecek olsa, kod yazmaya bugun devam edebilmen icin buraya nasil gecici bir kod yazarsin.

Buradan yukarida bir hata olsa ve cozumu 2 hafta sonra gelecek olsa, bu kismin calistigindan emin olmak icin yukaridaki 99 satiri nasil gecici bir kodla degistirirsin.
-veya-
Internet baglantin kesilmek uzere olsa ve 2 gun boyunca requests kullanamayacak olsan, kod yazmaya devam edebilmek icin neler yaparsin.

1 Beğeni

Şöyle tarif etmeye çalışayım o zaman, bakalım becerebilecekmiyim.

string =  """
<html>
<head>
</head>
<body>

<div> <p>icerik</p>

<div class="iframeContainer"><iframe allowfullscreen="" data-media-id="8f8d922ab171cff4a70e334c1cc075a4" frameborder="0" height="250" src="https://domain.com/media/8f8d922ab171cff4a70e334c1cc075a4?postId=fffa11509f28" width="700"></iframe></div>
<div class="iframeContainer"><iframe allowfullscreen="" data-height="480" data-media-id="42de5f2a9a86208d9c1d6c9879edf9b3" data-width="854" frameborder="0" height="393" src="https://domain.com/media/42de5f2a9a86208d9c1d6c9879edf9b3?postId=fffa11509f28" width="700"></iframe></div>


</body>
</html>
"""

 

ifadem bu src=“https://domain.com/media/8f8d922ab171cff4a70e334c1cc075a4?postId=fffa11509f28

Src içeriğini alıp request ile kaynaktan twitter post linkini alıyorum. Src içeriği dinamik. Buraya kadar sorun yok zaten. Daha sonra
div class=“iframeContainer”> bloğunu kendi linkimle değiştirmek ve değiştirdiğim içeriği string olarak çıktı almak istiyorum. Çünkü bu string html kaynağını kullanmaya devam edeceğim.

Dostum senin bu örnekte re kullanmana gerek yok bence.

replace = ["www.link1.com", "www.link2.com"]

string =  """
<html>
<head>
</head>
<body>

<div> <p>icerik</p>

<div class="iframeContainer"><iframe allowfullscreen="" data-media-id="8f8d922ab171cff4a70e334c1cc075a4" frameborder="0" height="250" src="https://domain.com/media/8f8d922ab171cff4a70e334c1cc075a4?postId=fffa11509f28" width="700"></iframe></div>
<div class="iframeContainer"><iframe allowfullscreen="" data-height="480" data-media-id="42de5f2a9a86208d9c1d6c9879edf9b3" data-width="854" frameborder="0" height="393" src="https://domain.com/media/42de5f2a9a86208d9c1d6c9879edf9b3?postId=fffa11509f28" width="700"></iframe></div>


</body>
</html>
"""
for i in replace:
    string = string.replace('<div class="iframeContainer">', i, 1)
    
print(string)

Çıktı:

<html>
<head>
</head>
<body>

<div> <p>icerik</p>

www.link1.com<iframe allowfullscreen="" data-media-id="8f8d922ab171cff4a70e334c1cc075a4" frameborder="0" height="250" src="https://domain.com/media/8f8d922ab171cff4a70e334c1cc075a4?postId=fffa11509f28" width="700"></iframe></div>
www.link2.com<iframe allowfullscreen="" data-height="480" data-media-id="42de5f2a9a86208d9c1d6c9879edf9b3" data-width="854" frameborder="0" height="393" src="https://domain.com/media/42de5f2a9a86208d9c1d6c9879edf9b3?postId=fffa11509f28" width="700"></iframe></div>


</body>
</html>

Neyse hocam, ben derdimi anlatamadım herhalde. Sizi uğraştırdım kusura bakmayın. Ben farklı kaynaklara bakmayı deneyeceğim. Hoşcakalın.

Böyle demediniz mi? Ben de o kısmı değiştirdim. Başka bir şey mi yapmak istiyorsunuz?

<div class="iframeContainer"><iframe allowfullscreen="" data-media-id="8f8d922ab171cff4a70e334c1cc075a4" frameborder="0" height="250" src="https://domain.com/media/8f8d922ab171cff4a70e334c1cc075a4?postId=fffa11509f28" width="700"></iframe></div>

Yukarıdaki bloğu komple değiştirmek amaçım. re kullanmadan nası değiştireceğim hocam. Aşağıdaki kod biraz işe yarıyor fakat benim işimi görmüyor. Ben komple iframeContainer içeriğini alıp değiştirmem lazım kısacası.

q = requests.get(urllib.parse.unquote(wayurl),headers=headers,allow_redirects=True)
soup = BeautifulSoup(q.content,"html.parser")

#bu çalışıyor ama yetersiz.
for a in soup.findAll('iframe'):
    link = mediabaglanti(a["src"]) #youtube video linki ve twitter post linkleri döndürür.
    a['src'] = a['src'].replace(a["src"], link)

result = str(soup)
print(soup)

Mesala böyle denemelerimde oldu. Fakat değiştirmiyor.

re.sub(r'<div class=\"iframeContainer\"><iframe(.*?)src=\"'+a['src']+'\"(.*?)<\/iframe><\/div>',link,str(soup),flags= re.MULTILINE)

re içeriğini bir boş bir diziye atadığım zaman for içinde aynı kaynak kodu iki sefer yazdırıyor. Normal bir değişkene atadığım zamanda en son işlemi yapıyor. Halbuki kaynakta 2 tane iframe var

replace fonksiyonunun son argümanı değiştirme adediyle ilgili, hiç denediniz mi?

replace(eski string, yeni string, değiştirme adedi)

Hocam ne alakası var anlamadımki, adetlerle benim işim yok. Binlerce medya öğesi var. Dinamik şekilde olduğunu belirttim. Hepsini bulup kaç tane varsa artık değiştirmek linklerle amaçım bu yani :slight_smile:
Hoşcakalın

Neyse, yardımcı olamadık. Kusurumuza bakmayın artık. İyi geceler.

Ne kusuru hocam. Benim bir kusurum olduysa afola. Surçi lisan ettiysek afola.

Estağfurullah, problemle alakalı bir yanlış anlaşılma oldu sanırım. Keşke “kodlar şunlar, bu kodlarla şöyle bir çıktı alıyorum. ama benim almak istediğim çıktı şu şekilde. bunu da bir türlü yapamadım.” şeklinde bir diyalog gerçekleşseydi, belki daha rahat yardımcı olabilirdik.

1 Beğeni