@Markus-Zeyfert

Почему не работает цикл while?

Нужно чтобы программа следила за самым свежим объявлением на сайте. Написал вот такой код (опытные, сразу простите за вырвиглазность, программирование второй день изучаю).
В моей теории функция refrash() должна выполняться до тех пор, пока данные, полученные в переменную new, не перестанут быть равны данным переменной item.
Но чёт видимо не так делаю...

import requests
from bs4 import BeautifulSoup

URL = 'https://www.avito.ru/novosibirsk/kvartiry/prodam-ASgBAgICAUSSA8YQ?cd=1&f=ASgBAQICAUSSA8YQAUCQvg0Ulq41&proprofile=1&s=104'
HEADERS = {'user-agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36', 'accept': '*/*'}
HOST = 'https://www.avito.ru'

item = ''
new = ''

def get_html(url, params=None):
    r = requests.get(url, headers=HEADERS, params=params)
    return r

def get_content(html):
    soup = BeautifulSoup(html, 'html.parser')
    global item
    item = soup.find('div', class_='item__line')
def parse():
    html = get_html(URL)
    if html.status_code == 200:
        get_content(html.text)
    else:
        print('Error')

parse()

def refrash():
    def get_html(url, params=None):
        r = requests.get(url, headers=HEADERS, params=params)
        return r
    def get_content(html):
        soup = BeautifulSoup(html, 'html.parser')
        global new
        new = soup.find('div', class_='item__line')
    def parse():
        html = get_html(URL)
        if html.status_code == 200:
            get_content(html.text)
        else:
            print('Error')
    parse()

while new== item:
    refrash()
  • Вопрос задан
  • 117 просмотров
Пригласить эксперта
Ответы на вопрос 5
MorganDusty
@MorganDusty
refrash говоришь?)

P.S: В КОДЕ "REFRASH" ИЗМЕНИ НА "REFRESH"
Ответ написан
SoreMix
@SoreMix
yellow
Непонятно, конечно, зачем у вас продублированы функции, и функции лежат в функциях, ну да ладно

Все правильно, цикл работает пока new == item. Выполнилась функция parse(), записала новый контент в переменную item, в то же время переменная new осталось старой и равна пустой строке. В итоге item != new и цикл не выполнился и ваш рефраш никогда не выполнялся
Ответ написан
Dr_Elvis
@Dr_Elvis
Правильно не работает.
У вас ещё ДО того как дойдёт код до while уже в item не пусто.
Ответ написан
@Kra1ven
Потому что к моменту когда код добирается до цикла, new не равен item. Также зачем тебе повторяющийся код, удали функции которые до "refrash"
Ответ написан
@c00re
Python Developer
Вам в refrash не нужно переобъявлять функции get_html, get_content и parse
import requests
from bs4 import BeautifulSoup

URL = 'https://www.avito.ru/novosibirsk/kvartiry/prodam-ASgBAgICAUSSA8YQ?cd=1&f=ASgBAQICAUSSA8YQAUCQvg0Ulq41&proprofile=1&s=104'
HEADERS = {'user-agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36', 'accept': '*/*'}
HOST = 'https://www.avito.ru'

item = ''
new = ''

def get_html(url, params=None):
    r = requests.get(url, headers=HEADERS, params=params)
    return r

def get_content(html):
    soup = BeautifulSoup(html, 'html.parser')
    item = soup.find('div', class_='item__line')
    return item
def parse():
    html = get_html(URL)
    if html.status_code == 200:
        item = get_content(html.text)
        return item
    else:
        print('Error')

def refrash():
    new = parse()
    return new

item = parse()

while refrash() == item:
    refrash()

Я тут ещё поменял кое-что. В refrash Вы по-сути делаете то же самое, что и в parse. Можно сделать один раз parse, а потом проверять с результатом refrash(хоть и без неё можно обойтись):
import requests
from bs4 import BeautifulSoup

URL = 'https://www.avito.ru/novosibirsk/kvartiry/prodam-ASgBAgICAUSSA8YQ?cd=1&f=ASgBAQICAUSSA8YQAUCQvg0Ulq41&proprofile=1&s=104'
HEADERS = {'user-agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36', 'accept': '*/*'}
HOST = 'https://www.avito.ru'

item = ''
new = ''

def get_html(url, params=None):
    r = requests.get(url, headers=HEADERS, params=params)
    return r

def get_content(html):
    soup = BeautifulSoup(html, 'html.parser')
    item = soup.find('div', class_='item__line')
    return item
def parse():
    html = get_html(URL)
    if html.status_code == 200:
        item = get_content(html.text)
        return item
    else:
        print('Error')

item = parse()

while parse() == item:
    parse()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы