Помогите пожалуйста (кто чем может) решить проблему.
Парсю данные и заливаю их в БД.
### часть кода из 1го метода, который завершается формированием словаря
basic_dict[self.country][city.text.lstrip()][name] = dict(
detailed_url=detailed_url,
place_type=self.place_type
)
### тут 2ой метод, который завершается расширением первого словаря
extended_dict[self.country][city][cinema].update(dict(
address=street1,
phone_number=phone1,
official_website=website1)
)
self.showtime(extended_dict)
### тут 3ий метод, который принимает расширенный словарь
### и начинает уже парсить данные и заливать в БД.
def showtime(self, extended_dict):
showtime_dict = extended_dict
for city in showtime_dict[self.country]:
for cinema in showtime_dict[self.country][city]:
url = showtime_dict[self.country][city][cinema]['detailed_url']
showtimes_tab_url = '/showtimes/#!=&cinema-section=%2Fshowtimes%2F'
tree = prepare_content(url + showtimes_tab_url)
for film in tree.xpath('//div[@class="content"]'):
film_name = film.xpath('.//a[@class="navi"]/text()')[0]
for date in film.xpath('.//li[contains(@class,"showtimes-day sdt")]'):
film_date = date.xpath('.//div[@class="date"]/text()')[0]
for time in date.xpath('.//ul[@class="showtimes-day-block"]/li'):
film_time = time.xpath('string(a/text())')
film_buy_ticket_url = time.xpath('string(a/@href)')
if len(film_time) == 0:
film_time = None
is_3d = time.find('span')
film_format = ''
if film_time is not None:
if is_3d is not None:
film_format = '3D'
else:
film_format = '2D'
# IMPORT
from app_places.models import Place
from app_shows_and_times.models import Show, Showtime
get_showtime_place = Place.objects.get(
place_name=cinema,
place_street=showtime_dict[self.country][city][cinema]['address']
)
get_showtime_show = Show.objects.get(show_name = film_name)
showtime = Showtime.objects.create(
showtime_dates=film_date,
showtime_times=film_time,
showtime_format=film_format,
showtime_buy_ticket_url=film_buy_ticket_url,
showtime_place=get_showtime_place,
showtime_show=get_showtime_show
)
Часть модели (и так уже кода много), где можно увидеть, что 2 поля идут как уникальные.
class Place(models.Model):
place_name = models.CharField(max_length = 50, db_index = True)
place_street = models.CharField(max_length = 80)
place_phone = models.CharField(max_length = 60)
place_official_site = models.URLField(max_length = 255, blank = True)
place_country = models.ForeignKey(Country)
place_city = models.ForeignKey(City)
place_type = models.ForeignKey(PlaceType)
class Meta:
db_table = 'place'
unique_together = (('place_name', 'place_street'))
Traceback (most recent call last):
File "
Проблема. Запускаю класс, пошел импорт, который заканчивается KeyError: ‘address’, при том что 4700 записей в БД уже создано (базу предварительно очищаю), значит, как я понимаю, до какого-то этапа данное выражение:
get_showtime_place = Place.objects.get(place_name = cinema, place_street = showtime_dict)
работает. Но никак не могу понять, откуда возникает сбой.
Соответственно 3 вопроса:
1) Правильно ли я использую unique? Т.е. в модели задал в мета классе, а в objects.get указываю оба эти поля. Так и нужно?
2) Нужно ли для place_street = models.CharField(max_length = 80) делать db_index = True?
3) По какой причине может идти заливка в БД со ссылкой на ‘address’ в словаре, и в итоге выдавать ошибку?
Как одно из предположений, возможно 4700 записи и должно быть, но я тогда не понимаю, почему процесс заканчивается ошибкой.
Простите за кучу кода.
UPD 1:
Думал уже, может где-то в базе Place нету записи street. Проверил - улицы везде указаны.
UPD 2:
Только лег в кровать, пришло озарение, как можно найти проблему.
У меня есть модель Showtimes, которая связана через FK с Places.
1 кинотеатр с адресом ул. Лаврухина, 4. ТЦ "РайON" вообще не проимпортировался в Places.
Подумал, что может скобки. Проверил - .replace('“', "'").replace('”', "'").replace('"', "'") - не помогло.
Может проблема в кириллице+латинице в названии?
Может как то unique_together влияет? У меня postgreSQL
Может теперь будет кому-то легче подсказать, куда мне ковырять?
Ответ
Проблема решена. Оказалось, что при парсинге для одного кинотеатра не оказалось информации об официальном веб-сайте. Так как я проверку полей не делал, то в словарь не добавлялись данные cinema_street, cinema_phone, cinema_website для этого одного кинотеатра. Нету данных -> ошибка.
Мой код без проверки наличия данных на сайте.
for city in extended_dict[country]:
for cinema in extended_dict[country][city]:
url = extended_dict[country][city][cinema]['detailed_url']
tree = prepare(url)
for street in tree.xpath(".//div[@class='address']"):
cinema_street = street.xpath("text()")[0].strip()
for phone in tree.xpath(".//div[@class='phone']"):
cinema_phone = phone.xpath("text()")[0].replace('Телефон:', '').strip()
for website in tree.xpath(".//div[@class='website']/a"):
cinema_website = website.xpath("@href")[0].strip()
extended_dict[country][city][cinema].update(dict(address = cinema_street,
phone_number = cinema_phone,
official_website = cinema_website))
Комментариев нет:
Отправить комментарий