The Rossoneri started strong, thanks in part to Christian Pulisic's continued impressive form early in the season. He played a pass to the back post, where Alexis Saelemaekers was waiting to score the opening goal just three minutes into the game.
Napoli created some early opportunities, with Mike Maignan making a save on a Miguel Gutierrez header and a Scott McTominay shot in the 11th minute. Strahinja Pavlovic attempted an improvised shot, but it was off-target.
As the game progressed, Napoli began to create more chances, with Andre-Frank Zambo Anguissa firing a shot over the bar. Youssouf Fofana had a chance to score, but the Frenchman soon set up the hosts' second goal instead.
Fofana met Pavlović's pass with a pass that allowed Pulisic to score with a deflection off Juan Jesus, making it his fourth goal of the season and putting him at the top of the Serie A scoring chart.
Saelemaekers had a shot saved by Alex Meret, while Giovanni Di Lorenzo and Anguissa had opportunities before the break.
After a strong first half for Milan, the second period saw a setback as Estupiñan was sent off after pulling down Di Lorenzo, who then scored a penalty to reduce the deficit.
Pulisic was substituted for Davide Bartesaghi, and the game became a test of Milan's defensive resilience and Napoli's patience on the ball.
Di Lorenzo sent a header wide, and Fikayo Tomori was injured, but Adrien Rabiot blocked a shot by Eljif Elmas, and David Neres' strike was deflected onto the woodwork by Luka Modric.
Milan held on through the added time to win their fourth consecutive Serie A match and take the top spot in the table, ending Napoli's 16-game unbeaten streak in the process.