Ошибка 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 шт):
А почему вы полностью не воспроизводите ошибку? Наверняка в сообщении, которое вам выдал интерпретатор есть указание на строку, в которой событие произошло и это сообщение необходимо для точного установления диагноза. А раз вы этого не сделали, то можно только предположить, что
titles = soup.find_all()
вернул вам пустой объект, соответственно следующий цикл не выполнился ни разу и переменная title в этом цикле не объявилась. А дальше тут
lin.append({
'title':title
и/или тут
answer[title]
вы попытались эту переменную использовать. В общем - учитесь выполнять отладку своей программы. Или хотя-бы понимать, как отладка работает и что для этого нужно.
Вы объявляете title во время итерации:
for title_a in titles:
title = title_a.get_text()
print(title)
Таким образом, title меняется во время каждой итерации, но после завершения итерации, интерпретатор забывает о нем.
Решение: объявите эти переменные до итерации
Так со всеми вашими переменными (photo, title, post и т.д.). Желательно переделать код.