Ошибка local variable 'title' referenced before assignment хотя переменная есть

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import time
from bs4 import BeautifulSoup
from selenium.webdriver.chrome.options import Options
option = Options()


option.add_argument("--disable-infobars")
option.add_argument("start-maximized")
option.add_argument("--disable-extensions")
link = []
option.add_experimental_option("prefs", { 
"profile.default_content_setting_values.notifications": 1 
})

lin = []
driver = webdriver.Chrome(ChromeDriverManager().install(),chrome_options=option)
answer = {}

def get_friends_content():
   driver.get('https://www.facebook.com/')
   driver.find_element_by_xpath('//*[@id="email"]').send_keys('[email protected]')
   driver.find_element_by_xpath('//*[@id="pass"]').send_keys('8c38E11n4\n')
   global time_text
   time.sleep(10)
   driver.get('https://www.facebook.com/profile.php?id=100068821046952')
   driver.implicitly_wait(5) # seconds
   SCROLL_PAUSE_TIME = 20
   last_height = driver.execute_script("return document.body.scrollHeight")
   while True:
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

        time.sleep(SCROLL_PAUSE_TIME)

        new_height = driver.execute_script("return document.body.scrollHeight")
        if new_height == last_height:
              break
        last_height = new_height
  time.sleep(20)
  html = driver.page_source
  soup = BeautifulSoup(html, 'html.parser')
  name_s = soup.find('h1',class_='gmql0nx0 l94mrbxd p1ri9a11 lzcic4wl')
  name = name_s.get_text()
  posts_time = soup.find_all('a',class_='oajrlxb2 g5ia77u1 qu0x051f esr5mh6w e9989ue4 r7d6kgcz 
  rq0escxv nhd2j8a9 nc684nl6 p7hjln8o kvgmc6g5 cxmmr5t8 oygrvhab hcukyx3x jb3vyjys rz4wbd8a 
  qt6c0cv9 a8nywdso i1ao9s8h esuyzwwr f1sip0of lzcic4wl gmql0nx0 gpro0wi8 b1v8xokw')
  for time_s in posts_time:
        time_post = time_s.get_text()
  try:
        likes = soup.find_all('span',class_='pcp91wgn')
        for like in likes:
              post_like = like.get_text()
  except Exception as e:
        post_like = '0'

  cooments_and_reposts = soup.find_all('span',class_='d2edcug0 hpfvmrgz qv66sw1b c1et5uql 
  lr9zc1uh a8c37x1j keod5gw0 nxhoafnm aigsh9s9 d3f4x2em fe6kdd0r mau55g9w c8b282yb iv3no6db 
  jq4qci2q a3bd9o3v knj5qynh m9osqain')
   
  try:
        for comment_and_repost in cooments_and_reposts:
              if 'Комментарии:' in comment_and_repost.get_text():
                    comment_r = comment_and_repost.get_text()
                    comment = comment_r.replace('Комментарии:','')
              elif 'Комментарии:' not in comment_and_repost.get_text():
                    comment = 'None'
              if 'Поделились:' in comment_and_repost.get_text():
                    repost_r = comment_and_repost.get_text()
                    repost = repost_r.replace('Поделились:','')
              elif 'Поделились:' not in comment_and_repost.get_text():
                    repost = 'None'
  except Exception as e:
        comment = 'None'
        repost = 'None'
        
  titles = soup.find_all('div',class_='kvgmc6g5 cxmmr5t8 oygrvhab hcukyx3x c1et5uql ii04i59q')
  for title_a in titles:
        title = title_a.get_text()
        print(title)


  photos = soup.find_all('img',class_='i09qtzwb')
  for photo_s in photos:
        photo = photo_s.get('src')
  lin.append({
        'title':title,
        'phohto':photo,
        'like':post_like,
        'coments':comment,
        'reposts':repost,
        'date':time_post,
  })

  
  answer[title] = lin
get_friends_content()

Пишу парсер для фейсбука.

UnboundLocalError: local variable 'title' referenced before assignment

У меня появляется вот такая ошибка. Не могу понять в чем дело ведь я её объявил

Помогите пожалуйста.

И как мне сделать что бы данные сохранялись вот так, постов может быть разное кол-во

answer = {'Тут должна быть фамилия и имя друга': [{'title': 'Тут должно быть название публикации', 'photo': 'Тут должна быть ссылка на фото, если ее нет, то None', 'likes': 123, 'comments': 234, 'reposts': 12, 'date': 'Дату можно в любом формате, главное наличие и времени и даты'}, {'title': 'Тут должно быть название второй публикации публикации', 'photo': 'Тут должна быть ссылка на фото, если ее нет, то None', 'likes': 123, 'comments': 234, 'reposts': 12, 'date': 'Дату можно в любом формате, главное наличие и времени и даты'}, {'title': 'Тут должно быть название 3ей публикации', 'photo': 'Тут должна быть ссылка на фото, если ее нет, то None', 'likes': 1234, 'comments': 2344, 'reposts': 112, 'date': 'Дату можно в любом формате, главное наличие и времени и даты'}]}


Ответы (2 шт):

Автор решения: passant

А почему вы полностью не воспроизводите ошибку? Наверняка в сообщении, которое вам выдал интерпретатор есть указание на строку, в которой событие произошло и это сообщение необходимо для точного установления диагноза. А раз вы этого не сделали, то можно только предположить, что

titles = soup.find_all()

вернул вам пустой объект, соответственно следующий цикл не выполнился ни разу и переменная title в этом цикле не объявилась. А дальше тут

lin.append({
        'title':title

и/или тут

answer[title] 

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

→ Ссылка
Автор решения: Bekhruz

Вы объявляете title во время итерации:

for title_a in titles:
        title = title_a.get_text()
        print(title)

Таким образом, title меняется во время каждой итерации, но после завершения итерации, интерпретатор забывает о нем.

Решение: объявите эти переменные до итерации

Так со всеми вашими переменными (photo, title, post и т.д.). Желательно переделать код.

→ Ссылка