Web kazıma hakkında bir döngü sorusu!

IMDB’den rastgele bir film sayfası seçiyor. Eğer sayfa "404"se döngüde 404 olmayan bir film sayfası bulana kadar çeviriyor. Buraya kadar her şey hoş güzel ama ben şöyle bir şey istiyorum. Mesela döngü şöyle olsa “imdb’si 7’den büyük bir film bulana kadar dön”

Ne kadar denediysem olmadı.

import requests
from lxml import html
import random
import re
from imdb import IMDb


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd

a=("https://www.imdb.com/title/tt")
b=random.randint(1000000,9999999)
c=(a+str(b))
url = c
istek = requests.get(url = url)
html = istek.text
soup = BeautifulSoup(html, 'html.parser')

i=soup.title.text

z="404 Error - IMDb"

while i == z:
    a=("https://www.imdb.com/title/tt")
    b=random.randint(1000000,9999999)
    c=(a+str(b))
    url = c
    istek = requests.get(url = url)
    html = istek.text
    soup = BeautifulSoup(html, 'html.parser')
    i=soup.title.text
    if (i != "404 Error - IMDb"):
        break

        
print("Web Sayfası:", c)
print("Filmin Adı:", soup.title.text)


#print(soup.find(string=re.compile("genre")))

movie_div2 = soup.find('span', itemprop='ratingValue')
if movie_div2 is None:
    print("IMDB Puanı: Derecelendirilecek kadar puanı yok.")
else:
    print("IMDB Puanı:", movie_div2.text)

movie_div = soup.find('div', class_='summary_text').text

if movie_div=="Add a Plot":
    print("Filmin Konusu: Yok")
else:
    print("Filmin Konusu:", movie_div)


#movie_div3 = soup.find_all('div', class_='poster')
#print("POSTER:",movie_div3)

#movie_div4 = soup.find_all('div', class_='subtext')
#print("TÜR:",movie_div4)

Çıktı

Web Sayfası: https://www.imdb.com/title/tt4676528
Filmin Adı: The Removals (2016) - IMDb
IMDB Puanı: Derecelendirilecek kadar puanı yok.
Filmin Konusu:
Part-thriller, part-nightmarish examination of the widening gap between originality and technology, told with remarkable precision. Haunting and engaging, The Removals imagines where we go from here.

Kodun cogunlugu tekrardan olusuyor. Tekrarlar engellenecek sekilde yeniden yazilmasini tavsiye ediyorum.

Python’da do...while olmadigi icin while True: if ... break kullanmak gerekecek.

Alternatif olarak veya bunun yaninda yapmani tavsiye ettigim sey ise film sayfasini alip istenen kritere (404 olmayan, 404 olmayip puani olup 7’den yukari olan) uygun olup olmadigini (True/False) donduren bir fonksiyon yazman.

Çok teşekkürler hocam. While true biraz daha ilerletti beni ve daha da sadeleştirdim.

import random
from requests import get
from bs4 import BeautifulSoup as Soup



while True: 
    a=("https://www.imdb.com/title/tt")
    b=random.randint(1000000,9999999)
    c=(a+str(b))
    url=get(c)
    request=url.text
    soup_data=Soup(request,'html.parser')
    imdb_puani=soup_data.find('span',{'itemprop':'ratingValue'})
    if imdb_puani is not None:
        imdb_puani=imdb_puani.text
        break

print(c)
print(soup_data.title.text)
print(imdb_puani)

Fakat imdb puanı büyük olanı getiri hala yapamıyorum.

İstiyorum ki

    if imdb_puani >8:

ama hata veriyor anlamıyorum.

Nereye yerleştirmeye çalıştığımı da göstereyim

while True: 
    a=("https://www.imdb.com/title/tt")
    b=random.randint(1000000,9999999)
    c=(a+str(b))
    url=get(c)
    request=url.text
    soup_data=Soup(request,'html.parser')
    imdb_puani=soup_data.find('span',{'itemprop':'ratingValue'})
    if imdb_puani is not None:
        imdb_puani=imdb_puani.text
    if imdb_puani >8:
        break

cahilliğimi bağışlayın.

imdb_puani değişkenini int olarak mı tutuyorsunuz yoksa str mi? Eğer str olarak tutuyorsanız karşılaştırma yapılamaz. Aynı şekilde None olduğunda da yapılamaz.

Zaten sıkıtı da o. imdb_puani döngüde bazen oluyor bazen olmuyor. Bu yüzden hangi değerde tutmam gerektiğini tam bulamadım.

Yaptım hocam oldu çok teşekkürler.

import random
from requests import get
from bs4 import BeautifulSoup as Soup




while True: 
    a=("https://www.imdb.com/title/tt")
    b=random.randint(1000000,9999999)
    c=(a+str(b))
    url=get(c)
    request=url.text
    soup_data=Soup(request,'html.parser')
    imdb_puani=soup_data.find('span',{'itemprop':'ratingValue'})
    if imdb_puani is not None:
        imdb_puani=imdb_puani.text
        imdb_puani=float(imdb_puani)
        if imdb_puani>7:      
            break

print(c)
print(soup_data.title.text)
print(imdb_puani)
2 Beğeni

Çözüm olarak işaretlerseniz benim gibi sonradan gelen kişiler cevabı aramakla uğraşmaz.