Разбор RSS XML с помощью Python Django - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь проанализировать 3 различных источника RSS, это источники.

https://www.nba.com/bucks/rss.xml
http://www.espn.com/espn/rss/ncb/news
http://rss.nytimes.com/services/xml/rss/nyt/ProBasketball.xml

По большей части структура всех этих трех источников похожа, за исключением URL-адреса

Я пытаюсь разобрать их в следующем объекте Feed,

class Feed(Base):
    title = models.CharField(db_index=True, unique=True, max_length=255)
    link = models.CharField(db_index=True, max_length=255, )
    summary = models.TextField(null=True)
    author = models.CharField(null=True, max_length=255)
    url = models.CharField(max_length=512, null=True)
    published = models.DateTimeField()
    source = models.ForeignKey(Source, on_delete=models.CASCADE, null=True)

Это исходный объект,

class Source(Base):
    name = models.CharField(db_index=True, max_length=255)
    link = models.CharField(db_index=True, max_length=255, unique=True)

Это код, который я использую для разбора,

import logging
import xml.etree.ElementTree as ET
import requests
import maya
from django.utils import timezone
from aggregator.models import Feed


class ParseFeeds:
    @staticmethod
    def parse(source):
        logger = logging.getLogger(__name__)
        logger.info("Starting {}".format(source.name))
        root = ET.fromstring(requests.get(source.link).text)
        items = root.findall(".//item")
        for item in items:
            title = ''
            if item.find('title'):
                title = item.find('title').text
            link = ''
            if item.find('link'):
                link = item.find('link').text
            description = ''
            if item.find('description'):
                description = item.find('description').text
            author = ''
            if item.find('author'):
                author = item.find('author').text
            published = timezone.now()
            if item.find('pubDate'):
                published = maya.parse(item.find('pubDate').text).datetime()
            url = ''
            if item.find('enclosure'):
                url = item.find('enclosure').attrib['url']
            if item.find('image'):
                url = item.find('image')
            if not Feed.objects.filter(title=title).exists():
                logger.info("Title:{} Link:{} Summary:{} Author:{} Published:{} Url:{}".format(title, link, description, author, published, url))
                feed = Feed(title=title, link=link, summary=description, author=author, published=published, url=url,
                            source=source)
                feed.save()
                logger.info("Adding {} from {}".format(feed.title, feed.source.name))

        logger.info("Finished {}".format(source.name))

Хотя я могу анализировать каждый из этих источников на консоли python, созданный здесь объект канала заканчивается всеми None или полями по умолчанию.Что я тут не так делаю.

1 Ответ

0 голосов
/ 09 февраля 2019

Вы должны использовать

for item in items:
    title = ''
    if item.find('title') is not None:    # The "is not None" part is critical here.
        title = item.find('title').text
    # And so on ...

Если вы попробуете в своем терминале

bool(item.find('title'))            # This is False
item.find('title') is not None      # while this is True

Каждый раз, когда вы хотите проверить, есть ли что-то или нет, используйте конструкцию if something is None.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...