Beautiful soup modülü find_all() metodu sorunu

import requests
from bs4 import BeautifulSoup

r = requests.get("https://instagram.com/{}".format(myusername))
soup = BeautifulSoup(r.content,"html.parser")
counts = soup.find_all("span", attrs={"class":"g47SY"})
print(counts)

kodum bu sayfa kaynağını selenium modülündeki driver.page_source şeklinde alınca r değişkeninden sonraki kısım sorunsuz çalışıyor fakat selenium bodülünde çok fazla zaman kaybı yaşadığım için bu şekilde yapmak istemiyorum yukarıdaki verdiğim kodda aldığım çıktı şu şekilde

[]

yani sorun burdaki find_all() metodunda fakat dediğim gibi başka bir scriptimde aynı kod sorunsuz çalışıyor. yardımcı olabilir misiniz ?

Span etiketi olmayabilir.

yazımı okumadınız galiba etiket ve class tamamen doğru diğer scriptimde çalışıyor tek fark r değişkenini diğer scriptimde selenium modülündeki driver.page_source ile almam bu scripte ise requests modülünün get() fonksiyonunu kullanıyorum.

Selenium kullanılacaksa bs4’e gerek yok.

Selenium yerine requests kullanınca kod çalışmıyorsa sayfada aradığınız elementler javascript ile oluşturuluyor olabilir.

requests ile sayfa kaynağını alabiliyorum ama find_all() metodunda bulunmuyor. Ve kinetik yükleme durumu da söz konusu değil. Javascript konusunda emin değilim fakat kullanıldığını düşünmüyorum. Çünkü html kaynağında görebiliyorum aradığım elementi.

requests ile elde ettiğiniz HTML’de aradığınız elementi görüyorsanız onu bs4 ile de seçebilmeniz lazım. Doğru selektörleri kullandığınıza emin olun.

Eminim çünkü diğer scriptimde aynı selektörleri kullanıyorum bunu belirtmiştim zaten.

HTML’deki elementin bs4 tarafından bulunamaması bs4’le alakalı bir bug olur, bir yerde bir şey kaçırıyor olma ihtimaliniz daha yüksek bence.

1 Beğeni

kodu alıp çalıştırın myusername yazan kısma kendi kullanıcı adınızı yazıp deneyebilirsiniz instagramdaki post,takipçi,takip edilenler sayılarını almak için kullanılıyor. 3 tane aynı class’a sahip span etiketi ver her biri post takipçi veya takip edilenlerin bilgisini tutuyor counts[0].text diyerek post sayısına ulaşabiliyordum mesela ama requests modülünde olmadı.

Cevabı en yukarıda @EkremDincel vermiş. Selenium’da alabildiğiniz verileri requests ile alamıyorsanız demek ki veriler dinamik olarak yükleniyor. Bir kullanıcı ismi ile deneyip kaynak kodu dosyaya yazdırdım ve g47SY ifadesini kaynak kodda aradım, malesef yok. Yani dinamik olarak yüklendiği kesin.

En az bir paylaşımı olan kullanıcıların bilgilerini meta etiketi ile alabilirsiniz.

import requests
from bs4 import BeautifulSoup

r = requests.get("https://instagram.com/{}".format(USERNAME))
parser = BeautifulSoup(r.content,"html.parser")
element = parser.find("meta",{"property":"og:description"})
bilgiler = element.get("content").split(", ")

takipci = bilgiler[0]
takip_edilen = bilgiler[1].strip()
post_sayisi = bilgiler[2].split("-")[0].strip()

print(takipci)
print(takip_edilen)
print(post_sayisi)
1 Beğeni

çok teşekkür ederim kod çok iyi ve hızlı çalışıyor ayrıca bir düzeltme yapmak istiyorum en az bir paylaşımı olmasına gerek yok kod düzgün çalışıyor teşekkür ederim cevabınız için iyi günler dilerim :slight_smile:

1 Beğeni