import logging import xml.etree.ElementTree as ET from services.dates import parse_datetime logger = logging.getLogger(__name__) # Distinctive root tags used to sniff feed (XML) content apart from HTML. FEED_MARKERS = ('``), RSS 1.0 (```` items) and Atom (````). Publication timestamps are taken from ``pubDate``, ``published``, ``updated`` or ``dc:date`` (``None`` when absent or unparseable). """ items = [] try: root = ET.fromstring(content) except ET.ParseError as e: logger.error("Failed to parse feed XML: %s", e) return items except Exception as e: logger.error("Unexpected error parsing feed: %s", e, exc_info=True) return items # Work over every / element regardless of nesting, which covers # RSS 2.0, RSS 1.0 (RDF) and Atom in one pass. entries = [el for el in root.iter() if _local(el.tag) in ('item', 'entry')] for entry in entries: title = _child_text(entry, ('title',)) if not title: continue published = _child_text(entry, ('pubDate', 'published', 'updated', 'date')) items.append((title, parse_datetime(published))) logger.info("Parsed %d entries from feed", len(items)) return items