Light-hitting Skip Schumaker capped a three-run eighth with a go-ahead infield hit after Ryan Franklin kept it close in the top half of the inning by striking out the side, leading St. Louis to a 4-3 victory on Tuesday night.
Franklin (1-3) earned his first victory since July 30 in his first appearance at home since April 23 and helped the Cardinals take tough-luck Chris Carpenter off the hook.
"I think he's used the time to get his delivery back together and quit tipping," manager Tony La Russa said. "If we're going to stay in this thing, he's a contributor."
Franklin's ERA remains an unsightly 7.36, but he's had three straight scoreless outings covering 4 2/3 innings.
"It feels good," Franklin said. "It feels real good."
Rookie Fernando Salas finished for his 10th save in 10 chances.
Manager Bruce Bochy said Belt likely would be out for a few days.
"It got me pretty good," Belt said. "I'm a little stiff but we took a few X-rays and everything looked pretty good. Hopefully I'll get back out here as soon as possible."
Albert Pujols and Allen Craig hit RBI doubles in the eighth before Schumaker, who had been in a 2-for-19 slump, got the go-ahead single against Javier Lopez (2-1) on a perfectly placed grounder between first and second. Schumaker's headfirst dive into the bag beat the throw from second baseman Freddy Sanchez, who went far to his left to glove the ball.
"Sanchez made a heck of a play to get there and when he caught it I went 'Oh my gosh,' " Schumaker said. "I knew I was going to dive, I had my mind made up already."
Lopez broke late to cover first and both he and first baseman Belt were near the bag. Lopez was not on the base when he caught an offline, late throw.
"I think that played a role because Freddy didn't know who exactly to throw to," Lopez said. "It's definitely not a routine play. It's just one of those where we're on the bad end."
Lopez lost for the first time since July 30 with Pittsburgh, the same day Franklin earned his last victory.
Schumaker also made the best defensive play of the game at second base, ranging far to his left to throw out Sanchez in the seventh.
Ryan Vogelsong pitched five effective innings for the Giants, yielding a run and six hits. It was the fifth consecutive solid outing for the right-hander, who replaced injured Barry Zito in the rotation in late April.
Vogelsong turned in a nice outing despite some troubles with the mound.
"I just never really got comfortable until about the third inning with the slope," he said. "I don't know quite what it was."
Vogelsong had been 1-4 with an 8.49 ERA in 14 career games against St. Louis.
Carpenter had a season-high eight strikeouts but otherwise labored, working with runners in scoring position all but one of his five innings and leaving down 2-1 after 103 pitches. The ace right-hander remained at 1-5 but avoided losing four straight decisions for the first time since 2002 with Toronto.
"Obviously it was a battle every inning," Carpenter said. "I did the best I could, tried to give them a chance and was able to make some pitches when I had to."
Cody Ross had two hits and an RBI and Sanchez also drove in a run for the Giants.
Cardinals leadoff hitter Ryan Theriot singled in the fifth to extend his hitting streak to 14 games, the longest active streak in the National League.
Jon Jay and Pujols opened the eighth with doubles off Sergio Romo. With one out, Craig doubled off Lopez to tie it and Schumaker's hit came with two outs. Pujols has only six doubles after entering the year averaging 42 per season.
Lopez has allowed five runs in his last six outings covering three innings. He permitted one run in his first 19 appearances and had been 4-0 in 51 games since joining the Giants last August in a trade with Pittsburgh.
Pujols made his second start this month at third base after zero starts at the position from 2003-2010. He had only one chance on a groundout by Miguel Tejada in the third.
Outfielder Matt Holliday was scratched for the Cardinals, still nursing a left quadriceps injury that hindered his running in his first game back on Monday. He pinch-hit in the fifth and took a called third strike.
Giants 1B Aubrey Huff, who has a team-leading 23 RBIs but only three the last 16 games, did not start and manager Bruce Bochy said he might sit Wednesday, too. Huff had a broken-bat popup to first as a pinch hitter in the sixth. ... Jay batted an NL-leading .397 in May with three homers and 12 RBIs.