Earlier, champions Juventus won 1-0 at Lazio for their second straight win of the new season.
Poland striker Arkadiusz Milik, signed to replace Gonzalo Higuain after last season's Serie A topscorer moved to Juventus in a 90 million euro move, scored twice in the first half to put Napoli in control.
M'baye Niang and Suso hit back in a four-minute spell early in the second half to pull Milan level but Jose Callejon put Napoli back in front in the 74th minute.
Juraj Kucka was sent off after he was booked for a push on Dries Mertens and immediately given another yellow card for swearing at the referee.
News that makes sense
Your trusted source for staying up-to-date with the world around you. Get free daily news updates and analysis, straight to your inbox.
Then Niang was given a second yellow card for pushing Napoli goalkeeper Pepe Reina before Alessio Romagnoli turned Lorenzo Insigne's shot into his own goal to complete Milan's misery.
Lazio continued an unhappy run against Juventus in the earlier game at the stifling Stadio Olimpico, where the match was halted for a water break in the 28th minute.
Sami Khedira settled the game in the 66th minute to extend Juve's 13-year unbeaten run against Lazio, while coach Massimiliano Allegri enjoyed the luxury of starting Higuain and fellow new signing Miralem Pjanic on the bench.
(Writing by Brian Homewood; Editing by Neville Dalton/Andrew Both)
