#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() технически будет работать, но каждый раз будет создаваться новый экземпляр, чего вы, возможно, захотите избежать