Bouhanni finished ahead of Giacomo Nizzolo and Michael Matthews after avoiding a massive crash in the final kilometre of stage 10.
Second-placed Nizzolo has now finished on the podium four times in the race so far.
The crash happened with around 700 metres to go and more than 15 riders were thrown off their bikes but a small group - including Bouhanni - managed to escape it unharmed.
The 173km stage from Modela to Salsomaggiore saw an attack straight from the start, with Marco Bandiera and Andrea Fedi sprinting out in front of the rest of the peloton.
Bandiera took the maximum points on the first intermediate sprint with Fedi taking second place.
The breakaway was caught with just under 10km left to race with Team Sky and BMC controlling the pace of the peloton.
The stage was mostly flat, setting up a sprint finish at the end and Bouhanni praised his team for helping him get into position before the sprint.
The FDJ rider was quoted by Sky Sports: "In the end it was really quick but my team did it perfectly. They were all ready to help me and we had a very good approach.
"In the final five hundred metres I did my job and I am happy with it."
With the withdrawal of Marcel Kittel and Mark Cavendish not taking part in the Giro this year, there aren't many riders who can match Bouhanni's speed in the race and the Frenchman will be hoping he can win more stages and add to the three he has already got.
Race leader Cadel Evans remains in the pink jersey and didn't lose any time to his rivals on this stage.
Giro d'Italia - Stage 10 result:
1 - Nacer Bouhanni (FRA) - FDJ - 4:01:13
2 - Giacomo Nizzolo (ITA) - Trek Factory Racing - ST
3 - Michael Matthews (AUS) - Orica-GreenEdge - ST
4 - Roberto Ferrari (ITA) - Lampre-Merida - ST
5 - Enrico Battaglin (ITA) Bardiano Valvoli - ST
6 - Vladimir Gusev (RUS) - Katusha - ST
7 - Albert Timmer (NED) - Giant-Shimano - ST
8 - Ben Swift (GBR) - Team Sky - ST
9 - Cadel Evans (AUS) - BMC Racing - ST
Giro d'Italia - General Classification after Stage 10:
1 - Cadel Evans (AUS) - BMC Racing - (42:50:47)
2 - Rigoberto Urán (COL) - Omega Pharma - Quick-Step - (+57)
3 - Rafal Majka (POL) - Tinkoff - Saxo - (+1:10)
4 - Domenico Pozzovivo (ITA) - AG2R - (+1:20)
5 - Steve Morabito (SUI) - BMC Racing - (+1:31)
6 - Fabio Aru (ITA) - Astana - (+1:39)
7 - Diego Ulissi (ITA) - Lampre - (+1:43)
8 - Wilco Kelderman (NED) - Belkin - (+1:44)
9 - Nairo Quintana (COL) - Movistar - (+1:45)
10 - Robert Kišerlovski (CRO) - Trek - (+1:49)
Write for GiveMeSport! Sign-up to the GMS Writing Academy here: http://gms.to/1a2u3KU