Updated

Right now, the Houston Astros' offense can't seem to get anything going.

First-year starter Kyle McClellan became the National League's first six-game winner and backup catcher Gerald Laird made his 10th start of the season count with a two-run double as the St. Louis Cardinals beat J.A. Happ and the Astros 4-2 on Thursday for a two-game sweep.

The Astros have lost five in a row, totaling just 29 hits while getting outscored 22-10. They haven't topped two runs in the last four games, they never had a lead in the series and they couldn't outscore a lineup minus Matt Holliday and Lance Berkman.

"We're just not getting that big hit when we need it," Clint Barmes said. "We're not making some plays behind our starting pitching that have hurt us.

"That's the stuff that's got to change real soon if you're going to win games."

Houston manager Brad Mills bemoaned bad luck in the first inning. Michael Bourn's game-opening liner knocked third baseman Daniel Descalso's glove off, but Descalso recovered in time to throw him out. Two batters later, Hunter Pence's liner deflected off McClellan (6-1) and right to second baseman Tyler Greene for another groundout.

"So, there's a lot of things good," Mills said. "But nothing happened."

Happ (3-5) had a season-best eight strikeouts with three walks and threw a season-high 119 pitches in six innings. He left trailing 3-1.

He said the pitch to Laird was his worst of the game but was happy with a 3-2 fastball that Allen Craig hit for his second homer leading off the sixth.

"I felt good," Happ said. "The difference was bad pitches with guys on base."

Craig homered in a three-hit game as the stand-in cleanup batter for Holliday. The Cardinals completed a 4-0 homestand behind stingy pitching that allowed only five runs. They jumped a half-game ahead of the Reds atop the NL Central.

Albert Pujols was 0 for 3 with a walk and has gone a career-high 91 at-bats since his last home run. Pujols has been stuck on seven homers since April 23 and the homerless drought tops his previous worst of 89 at-bats at the end of the 2009 season when he led the NL with 47.

After the start was delayed 55 minutes by rain, McClellan (6-1) allowed two runs in eight innings with five strikeouts and no walks. He retired the first 10 in order before Barmes doubled with one out in the fourth for the Astros' first baserunner.

Barmes went to third on Hunter Pence's single and scored on Carlos Lee's sacrifice fly.

McClellan hurt himself in the eighth with two wild pitches, doubling his season total. The second allowed Humberto Quintero to score the Astros' second run.

The previous three seasons McClellan had been a setup man, and he replaced injured Adam Wainwright in the rotation this year. The right-hander has worked eight innings in two of his last three starts and he bounced back from his first loss in his previous appearance.

None of the 29 Astros batters McClellan faced had a three-ball count.

"He was hitting his spots," Barmes said. "If you took any pitches, it seemed like you were down 0-2."

Fernando Salas worked the ninth for his fifth save in five chances, giving up a one-out single to Lee but then striking out Brett Wallace and Chris Johnson.

The Cardinals opened the second with a single, walk and Laird's fifth double of the season — one more than Pujols in only his 43rd at-bat — off the base of the left-field wall. Laird made his first start in eight days for the Cardinals, who are 8-2 when he starts.

Craig hit his second homer and first since April 11 on a full count leading off the sixth to make it 3-1. St. Louis capitalized on second baseman Bill Hall's fielding error to start the seventh with an RBI single by Ryan Theriot for a 4-1 cushion.

NOTES: Hall returned to the Astros' lineup after a two-day rest and was 0 for 3. ... Craig had been 1 for 10 in the first three games of the homestand. ... Cardinals starting catcher Yadier Molina is on a 10-for-15 tear with four straight multihit games, his best since compiling five straight June 16-20, 2009. ... CF Colby Rasmus returned to the Cardinals' lineup after missing four games due to an abdominal injury and had a double and a walk.