News feed python script
Shadowing
Your date parameter to the constructor of News is poorly-named, because it shadows the built-in date that you've imported from datetime.
Super
Your call to Article.__init__() should use super() instead.
Data classes
Article can just be a @dataclass with its explicit __init__ removed.
Static methods
publish_article doesn't make sense as a static method. In your invocations, you're always calling format_text() on a child instance, then passing that to a static method on the parent. Instead:

Define format_text(self) -&gt; str: raise NotImplementedError() on Article to declare it abstract
Change publish_article(self) to simply file.write(self.format_text())

Backslash continuation
Change this:
    return f&quot;{self.title}{(self.line_width - len(self.title)) * '-'}\n&quot;\
           f&quot;{self.text} \n&quot;\
           f&quot;{self.city}, {self.date.strftime('%d/%m/%Y %H:%M:%S')} \n&quot;\
           f&quot;{'-'*self.line_width}\n\n\n&quot;

to drop the backslashes and use parens instead:
    return (
        f&quot;{self.title}{(self.line_width - len(self.title)) * '-'}\n&quot;
        f&quot;{self.text} \n&quot;
        f&quot;{self.city}, {self.date.strftime('%d/%m/%Y %H:%M:%S')} \n&quot;
        f&quot;{'-'*self.line_width}\n\n\n&quot;
    )

Date parsing
This is evil:
    day, month, year = map(int, self.end_date.split('/'))

Instead, you should be using an actual parsing method out datetime to get you a date instance; then referring to its members. Since you're looking for DD/MM/YEAR, this will be:
end_date = datetime.strptime(self.end_date, '%d/%m/%Y').date()
# Use end_date.day, end_date.month, end_date.year

That said, if you're at all able, drop that date format like a sack of rotten potatoes. YYYY-mm-dd is sortable and unambiguous.