Brian Moehler (3-2) had his best outing in six starts this season, allowing two hits and striking out five in seven innings. He set down the Cardinals in order four times and retired the last eight batters he faced.
Geoff Blum homered in the eighth, his fourth of the season, as Houston won for the 13th time in 17 home games. Blum started at third base as manager Cecil Cooper shook up his lineup. The Astros had scored three runs or less in their last eight games and lost seven times.
Braden Looper (7-5), facing the Astros for the fourth time this season, matched a career high with seven strikeouts and gave up two earned runs and eight hits in six innings.
Mark Loretta blooped a single to right leading off the Houston third. He was forced on Humberto Quintero's grounder, but Quintero scored on Pence's two-out double off the right-field wall. Pence then scored on Kaz Matsui's single to center. Matsui was caught in a rundown after Pence crossed the plate.
Moehler allowed only one walk in the first three innings. Skip Schumaker started the fourth with a single, but Moehler retired the next three batters.
The Cardinals' defense broke down in the fourth as the Astros stretched the lead to 5-0.
Darin Erstad, another reserve like Blum who got a rare start Friday, led off with a double and Looper hit Lance Berkman in the foot with a pitch. Carlos Lee hit a bouncer to Cesar Izturis and the shortstop slipped as he made his move to field it. He still tried to start a double play, but his errant throw to Adam Kennedy sailed into foul territory down the right-field line. Erstad and Berkman scored and Lee reached third on Izturis' error.
Blum then hit a grounder to first baseman Albert Pujols, who threw home to get Lee, but Yadier Molina dropped the ball and Lee scored. Molina was charged with an error.