St. Louis, which made a pair of ninth-inning errors that led to two unearned runs, has lost eight of 11 at home and is 33-29 this year at Busch Stadium while going a NL-best 37-29 on the road.
Snell (5-10) won for only the second time in 11 starts since June 17, allowing three hits while striking out eight and walking one. He allowed just two runners to reach scoring position against a team that scored 19 earned runs in 19 innings against him in four previous starts this year.
Center fielder Nyjer Morgan, recalled earlier in the day when Doug Mientkiewicz went on the bereavement list, made a nice running catch on Albert Pujols' drive to the warning track to end the eighth and preserve a 1-run lead. T.J. Beam allowed pinch hitter Adam Kennedy's RBI single before striking out Brian Barton with the bases loaded for his first career save,
Beam became the seventh Pirates pitcher to get a save, the most since eight Pittsburgh pitchers had saves in 1996.
In the ninth, catcher Yadier Molina dropped a forceout relay, and center fielder Skip Schumaker's throwing error on a sacrifice fly allowed another run. St. Louis has 11 errors in the last eight games.
Kyle McClellan walked Steve Pearce with the bases loaded for a third run, one at-bat after Molina made an ill-advised and late throw to third on Jason Michaels' sacrifice bunt.
Looper (11-10) allowed one run and three hits in seven innings. He has a 2.03 ERA in his last six starts, going 2-3 in that stretch while losing 3-0 and 2-1 games.
Paid attendance of 39,502 was the Cardinals' first below 40,000 in 39 dates since May 14
-- when they played the Pirates.