Yazbel Forumdaki Konu Başlıklarını Çekmek

Merhabalar,
Kendimi geliştirmek ve BeautifulSoup ile requests modüllerini kavramak için yaptığım bir uygulamada hatalar alıyorum ve sonuca ulaşamıyorum. Çok kez denedim fakat çözüme ulaşamadım. Uygulamanın amacı yazbel forumunda açılan son konuları çekmek. Fakat kodumda “find()” ve “.text” komutlarına hata alıyorum. Yardımcı olabilecek arkadaşlar varsa çok sevinirim, saygılarımla.

Kodum:

from bs4 import BeautifulSoup as bs
import requests

url = "https://forum.yazbel.com"

html_content = requests.get(url).text

soup = bs(html_content,"html.parser")

soup1 = soup.find("tr", {"id":"ember146"}).find("a").text
print(soup1)

Bu satir ne yapiyor?

Not: Ilk find’i soruyorum zira ikincisi calismiyor.

1 Beğeni

Evet, birincisi none değeri döndürdüğü için ikincisi hata veriyor. Bir konunun başlığını çekmeye çalıştım fakat çekemedim. Koddaki tablo yerine div veya spanları seçsem de “Yazbel forumuna hoşgeldiniz” ifadesini biçimlendirilmemiş bir şekilde çekmekten öteye gidemedim. Amacım herhangi bir konunun başlığını çekmek idi. Benim kodumu bir kenara bırakarak nasıl çekebiliriz onu da öğrensem yeterli, cevap için teşekkürler.

        <tr class="topic-list-item">
          <td class="main-link" itemprop='itemListElement' itemscope itemtype='http://schema.org/ListItem'>
            <meta itemprop='name' content='Yazbel Forumdaki Konu Başlıklarını Çekmek (Yardım)'>

Tum meta’lari, tum td’leri veya bu tablonun altindaki tum tr’leri cekerek baslasak?

1 Beğeni

Belirttiğiniz meta taglerini bulamadım, yanlış yolda mıyım? Ekran görüntüsündeki yoldan gitmeyi denemiştim fakat başarısız oldum. Nasıl bir yol izlemem lazım?

Sayfaya login’li bakiyorsun.

Yeni pencerede veya curl filan ile bak. (Veya requests cevabini yazdir.)

requests cevabını yazdırıp buldum teşekkür ederim. Fakat sadece bir tane çekebiliyorum, hepsini çekemiyorum hata alıyorum.

from bs4 import BeautifulSoup as bs
import requests

url = "https://forum.yazbel.com"

html_content = requests.get(url).text

soup = bs(html_content,"html.parser")

soup1 = soup.find("td",{"class":"main-link"}).a.text

print(soup1)

Bu şekilde yaptığımda çalışıyor ve find() kullandığımdan ilk bulduğu sonucu alıyor, text e çeviriyor. Fakat find_all() yaptığımda kod çalışmıyor ve hata veriyor;

Traceback (most recent call last):
  File "C:\Users\onur_\OneDrive\Masaüstü\web-scrap.py", line 10, in <module>
    soup1 = soup.find_all("td",{"class":"main-link"}).a.text
  File "C:\Users\onur_\AppData\Local\Programs\Python\Python39\lib\site-packages\bs4\element.py", line 2173, in __getattr__
    raise AttributeError(
AttributeError: ResultSet object has no attribute 'a'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?

Hata mesajı oldukça açıklayıcı. Okumayı denediniz mi?

Evet, find_all() yerine find() yazdığımda da hata alıyorum.

Yukarıda çalıştığını söylemediniz mi?

Çalışıyor fakat “.a.text” eklemeden çalışıyor. Onları eklemeden çalıştırdığımda ise 602 satır çıktı alıyorum. Bunu ayıklamak için “a.text” eklediğimde ise hata alıyorum.

from bs4 import BeautifulSoup as bs
import requests

url = "https://forum.yazbel.com"

html_content = requests.get(url).text

soup = bs(html_content,"html.parser")

soup1 = soup.find_all("td",{"class":"main-link"}).a.text

print(soup1)

Burada öyle yazmıyor, yukarıda çalıştığını söylediğiniz kodda a.text var:

Hangi kodun çalıştığını, hangi kodun ne hata verdiğini netleştirmezseniz yardım edemem.

Cevaplarınız için teşekkür ediyorum, liste şeklinde döngü içerisinde çekince hata çözüldü.

from bs4 import BeautifulSoup as bs
import requests
import re

url = "https://forum.yazbel.com"

html_content = requests.get(url).text

soup = bs(html_content,"html.parser")

soup1 = soup.find_all("td",{"class":"main-link"})

liste = [1,2,3,4,5,6,7,8,9,10]    

for i in liste:
    print(soup1[i].a.text)

Şuan son 10 konuyu çekmeyi başardım, yardımcı olan herkese teşekkür ederim.

1 Beğeni