BeautifulSoup ile tek satırlık parça bulma

Selamlar,

ACSEL - Acıselsan Acıpayam Selüloz Hisse Senedi | İş Yatırım sayfasındaki F/K satırının yanındaki 7,9 değerini almak istiyorum.

url = f"https://www.isyatirim.com.tr/tr-tr/analiz/hisse/Sayfalar/sirket-karti.aspx?hisse=ACSEL"
response = requests.get(url)
html_icerigi = response.content
corba = BeautifulSoup(html_icerigi,"html.parser")

aranan = corba.find_next_sibling("F/K")

print(aranan)

Şeklinde yazdım ama sonuç none geliyor. Bunu nasıl çözebilirim?

Teşekkürler

Sadece sonuç odaklı ve işin görülsün diye kendimce bir kod yazdım…Daha farklı çözümleri var onları da bulmak için ilgileneceğim:)
İlk olarak headers ekledim.

headers={'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"}

Sonra kodunda yaptığım ufak dokunuşlar aşağıda;

response = requests.get(url,headers=headers)
html_icerigi = response.content
corba = BeautifulSoup(html_icerigi,"html.parser")
aranan = corba.find_all("td")
sonuc=(str(aranan[918]).split(">")[1]).split("<")[0]
print(sonuc)

Kodda yazmadığım olay şu önce td etiketlerini aldım tam 929 tane ardından bizim istediğimizin sırasını buldum.
918. td etiketi bizim istediğimiz yer>> <td>8,0</td>
Ayıklamak için de split kullandım.:slight_smile:

Bu da stackoverflow çözümü ;

corba = BeautifulSoup(html_icerigi,"html.parser")
ilk=corba.find(text="F/K")
b_tag = ilk.parent
td_tag = b_tag.parent
next_td_tag = td_tag.findNext('td')
print(next_td_tag.contents[0])###Sonucumuz

Link istersen…

Yardımlar için teşekkür ederim ama sonuca ulaşamadım. @Efkan tek bir sayfada çalışıyor ama çoklu sayfada sorun oluyor. stackoverflow çözümüde maalesef cözüm değil. Büyük ihtimalle sayfa kodlamasıyla alakalı bir durum. Belirli bir sistematiğe oturmuyor.

Aynı değer yahoo üzerinde buldum.

liste=[]
for x in kodlar:
    url=f"https://finance.yahoo.com/quote/"+x
    print(url)
    
    response = requests.get(url)
    html_icerigi = response.content
    corba = BeautifulSoup(html_icerigi,"html.parser")

    deger = corba.find("td",{"class":"Ta(end) Fw(600) Lh(14px)"})
    
    liste.append(deger)
    print(deger)

print(liste)

sonuç boş geliyor.
sayfanın kaynak koduna bakınca

<span>PE Ratio (TTM)</span></td><td class="Ta(end) Fw(600) Lh(14px)" data-test="PE_RATIO-value">3.34</td>

almak istediğim değer 3.34
url’yi url=f"https://finance.yahoo.com/quote/ATAGY.IS şeklinde deneyebilirsiniz.

Ben sadece bir sayfada arama yapıyorsun diye çözümü sundum.
Şimdi paylaştığın linki sadece şu şekilde alabiliyorum

deger=corba.find("td", {'data-test':"PE_RATIO-value"})
print(deger.text)


Ta(end) Fw(600) Lh(14px)

Kodu işe yaramıyor çünkü benzer adda farklı classlar da var.Sen sadece 3,34 ü çekmiyorsun dizi çekiyorsun birden çok class olduğu için.Onun için ögeyi incelediğinde DATA-TEST diye bir şey var onu kullanarak aradım.
Eğer farklı sitelerden tek bir fonksiyon ile veri çekip kaşılaştırma gibi bir şeyler deniyorsan olmaz çünkü dediğin gibi her sitenin altyapısı(kodları vs) farklı.

Senin koddaki deger değişkeninin ne çektiğine bakalım…

<td class="Ta(end) Fw(600) Lh(14px)" data-test="PREV_CLOSE-value">4.0300</td>
<td class="Ta(end) Fw(600) Lh(14px)" data-test="OPEN-value">4.0100</td>
<td class="Ta(end) Fw(600) Lh(14px)" data-test="BID-value">3.9600 x 0</td>
<td class="Ta(end) Fw(600) Lh(14px)" data-test="ASK-value">3.9800 x 0</td>
<td class="Ta(end) Fw(600) Lh(14px)" data-test="DAYS_RANGE-value">3.9500 - 4.0200</td>
<td class="Ta(end) Fw(600) Lh(14px)" data-test="FIFTY_TWO_WK_RANGE-value">3.3300 - 5.5000</td>
<td class="Ta(end) Fw(600) Lh(14px)" data-test="TD_VOLUME-value"><fin-streamer active="" data-dfield="longFmt" data-field="regularMarketVolume" data-pricehint="2" data-symbol="ATAGY.IS" data-trend="none" value="162,266">162,266</fin-streamer></td>
<td class="Ta(end) Fw(600) Lh(14px)" data-test="AVERAGE_VOLUME_3MONTH-value">225,035</td>
<td class="Ta(end) Fw(600) Lh(14px)" data-test="MARKET_CAP-value">94.525M</td>
<td class="Ta(end) Fw(600) Lh(14px)" data-test="BETA_5Y-value">0.23</td>
<td class="Ta(end) Fw(600) Lh(14px)" data-test="PE_RATIO-value">3.34</td>
<td class="Ta(end) Fw(600) Lh(14px)" data-test="EPS_RATIO-value">1.1900</td>
<td class="Ta(end) Fw(600) Lh(14px)" data-test="EARNINGS_DATE-value"><span>Oct 30, 2020</span></td>
<td class="Ta(end) Fw(600) Lh(14px)" data-test="DIVIDEND_AND_YIELD-value">N/A (N/A)</td>
<td class="Ta(end) Fw(600) Lh(14px)" data-test="EX_DIVIDEND_DATE-value"><span>May 12, 2014</span></td>
<td class="Ta(end) Fw(600) Lh(14px)" data-test="ONE_YEAR_TARGET_PRICE-value">N/A</td>

Gördüğün gibi Ta(end) Fw(600) Lh(14px) ile bölemiyorsun içerideki DATA-TEST kullanılacak.

Hocam sen nasıl yanıt aldın?

liste=[]
for x in kodlar:
    url=f"https://finance.yahoo.com/quote/"+x
    print(url)
    
    response = requests.get(url)
    html_icerigi = response.content
    corba = BeautifulSoup(html_icerigi,"html.parser")

    deger=corba.find('td', {'data-test':'PE_RATIO-value'})
    
    print(deger)

kodu ile

https://finance.yahoo.com/quote/ACSEL.IS
None
https://finance.yahoo.com/quote/ADEL.IS
None
https://finance.yahoo.com/quote/ADESE.IS
None

Şeklinde alıyorum

Şimdi kodlar dediğin şeyi paylaşmamışsın.Kodlar’da ne var bilmiyorum.Benim kodum tam olarak şu ve yanıt dönderiyor…

import requests
from requests import session as ses
from bs4 import BeautifulSoup
liste=[]
url="https://finance.yahoo.com/quote/ATAGY.IS"
print(url)
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'}
response=requests.get(url,headers=headers)
html_icerigi=response.content
corba=BeautifulSoup(html_icerigi, "html.parser")

deger=corba.find("td", {'data-test':"PE_RATIO-value"})
liste.append(deger)
print(deger.text)
print(liste)

Edit:Dostum headers eklemeden çalıştırınca 404 dönderiyor.Bilgin olsun.

Evet problem headers :slight_smile:

Çok teşekkür ederim, zahmet oldu ama çok işime yaradı

Kolay gelsin.Pratik iyidir ben de tekrar etmiş oldum :slight_smile: