beautifulsoup (webscraping) не обновляет переменные при изменении текста HTML

#python #variables #debugging #web-scraping #beautifulsoup

#python #переменные #отладка #веб-очистка #beautifulsoup

Вопрос:

Я новичок в python и не могу понять, почему это не работает, но я сузил проблему до одной строки кода.

Цель этого бота — очистить HTML с веб-сайта (используя beautiful и post в discord при изменении текста. Я использую FC2 и FR2 (flightcategory2 и flightrestrictions2) в качестве переменных памяти для проверки кода при каждом запуске. Если они совпадают, код ожидает _ минут и снова проверяет, отличаются ли они, он публикует его.

Однако при запуске этого кода переменные «flightCategory» «flightRestrictions» изменяются при первом запуске кода, но по какой-то причине перестают меняться при изменении текста HTML на веб-сайте. рассматриваемая строка — это цикл if.

 if 1==1: # using 1==1 so this loop constantly runs for testing, otherwise I have it set for a time
        flightCategory, flightRestrictions = und.getInfo()
       
 

В режиме отладки код выполняется, но переменные в коде не обновляются, и я не понимаю, почему они обновляются при первом запуске кода, но не последовательно. раз. Эта строка имеет решающее значение для работы моего кода.

Вот сокращенная версия кода, чтобы его было легче читать. Я был бы признателен за любую помощь.

 FC2 = 0
FR2 = 0
flightCategory = ""
flightRestrictions = ""

class UND:
    def __init__(self):
        page = requests.get("http://sof.aero.und.edu")
        self.soup = BeautifulSoup(page.content, "html.parser")

    def getFlightCategory(self):    # Takes the appropriate html text and sets it to a variable
        flightCategoryClass = self.soup.find(class_="auto-style1b")
        return flightCategoryClass.get_text()

    def getRestrictions(self):  # Takes the appropriate html text and sets it to a variable
        flightRestrictionsClass = self.soup.find(class_="auto-style4")
        return flightRestrictionsClass.get_text()

    def getInfo(self):
        return self.getFlightCategory(), self.getRestrictions()

und = UND()
while 1 == 1:
    if 1==1:    #using 1==1 so this loop constantly runs for testing, otherwise I have it set for a time
        flightCategory, flightRestrictions = und.getInfo()   (scrape the html from the web)
        if flightCategory == FC2 and flightRestrictions == FR2:  # if previous check is the same as this check then skip posting
            Do Something
        elif flightCategory != FC2 or flightRestrictions != FR2:  # if any variable has changed since the last time
            FC2 = flightCategory  # set the comparison variable to equal the variable
            FR2 = flightRestrictions
            if flightRestrictions == "Manager on Duty:":  # if this is seen only output category
               Do Something
            elif flightRestrictions != "Manager on Duty:":
                Do Something
    else:
        print("Outside Time")
        time.sleep(5)  # Wait _ seconds. This would be set for 30 min but for testing it is 5 seconds. O

 

Ответ №1:

Согласно вашему коду, вы отправляете запрос только http://sof.aero.und.edu тогда, когда создаете экземпляр класса UND. Таким образом, атрибут soup вашего экземпляра никогда не обновляется во время цикла, и вы продолжаете получать устаревшие значения.

Вы могли бы заставить его работать со следующей логикой:

 class UND:
    def __init__(self):
        pass

    def scrape(self):
        page = requests.get("http://sof.aero.und.edu")
        self.soup = BeautifulSoup(page.content, "html.parser")

    ## SOME CODE

und = UND()
while 1 == 1:
    und.scrape() # We scrape the website at the beginning of each loop iteration

    ## SOME OTHER CODE
 

Комментарии:

1. Спасибо! Будет ли работать что-то вроде UND().getInfo? Я считаю, что при каждом вызове создается новый экземпляр … правильно?

2. Добро пожаловать! Вы правы, UND().getInfo() технически будет работать, но каждый раз будет создаваться новый экземпляр, чего вы, возможно, захотите избежать