Хорошего дня.

Я пишу небольшой скрипт, который извлекает данные RSS с помощью Feedparser.

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

Теперь, чтобы избежать дублирования данных, я установил в своих моделях Unique = True.

Конечно, теперь я занимаюсь ошибкой

return Database.Cursor.execute(self, query, params) sqlite3.IntegrityError: UNIQUE constraint failed: jobrss_rssjob.link

Хорошо, что это не дублирование данных. Однако он полностью приводит к сбою скрипта, поэтому он просто останавливается.

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

Вот мой код:

from __future__ import unicode_literals
import feedparser
from django.utils import timezone
import json
from django.db import IntegrityError

from jobrss.models import RSSJob

try:
        def run():

            sources = [
        "https://mybroadband.co.za/vb/external.php?type=RSS2&forumids=269",
        "http://www.bizcommunity.com/rssjobs.aspx?l=196&c=11&s=Developer&sm=1"
            ]
            data = []
            for url in sources:
                data.append(feedparser.parse(url))
                for data in data:
                    for post in data.entries:
                        title = post.title
                        link = post.link
                        add = RSSJob()
                        add.title = title
                        add.link = link
                        add.save()
                        print("Added successfully")
except IntegrityError:
    print("Data Already exists")

Любая рекомендация, как я могу это улучшить?

Ах да, это ошибки. Когда я запускаю скрипт в пустой базе данных:

(techvenv) Ronalds-MacBook-Pro:TWNEW burgundy$ python manage.py runscript rsspull
Added successfully
Added successfully
Added successfully
Added successfully
Added successfully
Added successfully
Added successfully
Added successfully
Added successfully
Added successfully
Added successfully
Added successfully
Added successfully
Added successfully
Added successfully
Exception while running run() in 'scripts.rsspull'
Traceback (most recent call last):
  File "/Users/burgundy/dev/Projects/techvenv/lib/python3.6/site-packages/feedparser.py", line 398, in __getattr__
    return self.__getitem__(key)
  File "/Users/burgundy/dev/Projects/techvenv/lib/python3.6/site-packages/feedparser.py", line 356, in __getitem__
    return dict.__getitem__(self, key)
KeyError: 'append'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)
  File "/Users/burgundy/dev/Projects/techvenv/lib/python3.6/site-packages/django/core/management/__init__.py", line 364, in execute_from_command_line
    utility.execute()
  File "/Users/burgundy/dev/Projects/techvenv/lib/python3.6/site-packages/django/core/management/__init__.py", line 356, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/burgundy/dev/Projects/techvenv/lib/python3.6/site-packages/django_extensions/management/email_notifications.py", line 63, in run_from_argv
    super(EmailNotificationCommand, self).run_from_argv(argv)
  File "/Users/burgundy/dev/Projects/techvenv/lib/python3.6/site-packages/django/core/management/base.py", line 283, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/Users/burgundy/dev/Projects/techvenv/lib/python3.6/site-packages/django_extensions/management/email_notifications.py", line 75, in execute
    super(EmailNotificationCommand, self).execute(*args, **options)
  File "/Users/burgundy/dev/Projects/techvenv/lib/python3.6/site-packages/django/core/management/base.py", line 330, in execute
    output = self.handle(*args, **options)
  File "/Users/burgundy/dev/Projects/techvenv/lib/python3.6/site-packages/django_extensions/management/utils.py", line 59, in inner
    ret = func(self, *args, **kwargs)
  File "/Users/burgundy/dev/Projects/techvenv/lib/python3.6/site-packages/django_extensions/management/commands/runscript.py", line 238, in handle
    run_script(mod, *script_args)
  File "/Users/burgundy/dev/Projects/techvenv/lib/python3.6/site-packages/django_extensions/management/commands/runscript.py", line 148, in run_script
    mod.run(*script_args)
  File "/Users/burgundy/dev/Projects/TWNEW/scripts/rsspull.py", line 18, in run
    data.append(feedparser.parse(url))
  File "/Users/burgundy/dev/Projects/techvenv/lib/python3.6/site-packages/feedparser.py", line 400, in __getattr__
    raise AttributeError("object has no attribute '%s'" % key)
AttributeError: object has no attribute 'append

И вот когда снова запускаю:

django.db.utils.IntegrityError: UNIQUE constraint failed: jobrss_rssjob.link

С уважением. :)

1
Ronald Langeveld 12 Ноя 2017 в 13:30

1 ответ

Лучший ответ

Ваша ошибка в том, что вы перехватываете исключение перед определением и запуском функции. Вам нужно переместить блок try...except внутри функции run().

Учти это:

>>> try:
        def run():
            print(1 / 0)
    except ZeroDivisionError:
        print "Can't divide by zero"

>>> run()
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
ZeroDivisionError: integer division or modulo by zero

Причина, по которой это происходит, заключается в том, что когда мы определяем функцию, Python фактически не запускает эту функцию. Итак, 1 / 0 не вызывает ошибок, пока мы определяем функцию. Здесь блок try...except будет обнаруживать ошибки только во время определения функции . Но когда мы вызываем функцию run(), мы запускаем ее вне блока try...except. Вот почему мы получаем ошибку.


Как это исправить:

Переместите блок try...except внутрь самого внутреннего цикла for функции run(). Пример:

def run():
    for url in sources:
        data.append(feedparser.parse(url))
        for data in data:
                for post in data.entries:
                    try:
                        title = post.title
                        ...
                        print("Added successfully")
                    except IntegrityError:
                        print("Data Already exists")
2
xyres 12 Ноя 2017 в 11:11