Nate Schierholtz’s two-run home run off Lance Lynn gave the Cubs a 2-1 lead in the fourth, and they hung on for a 2-1 win.
Travis Wood (3-2) threw another gem, allowing one run on five hits over 62/3 innings, and Kevin Gregg remained perfect with his fifth save in five chances.
The Cubs have won two straight and can end the homestand at .500 with a win Wednesday afternoon.
Wood has been as effective as any Cubs starter in years, becoming the first since Mark Prior in 2003 to start a season with seven consecutive quality starts. The last lefty to do so was Johnny Schmitz, who had seven straight in 1948.
The only run off Wood was a solo home run by Allen Craig leading off the second. Wood has allowed two or fewer runs in six of his seven starts, lowering his ERA to 2.33. Manager Dale Sveum left Wood in to throw a season-high 114 pitches before yanking him with two outs and no one on in the seventh.
Wood left to a standing ovation, while his replacement, Carlos Marmol, once again was greeted with boos.
But Marmol did the job, keeping the Cardinals scoreless for 11/3 innings. He gave up a two-out single in the seventh before retiring Matt Holliday on a fly to center to end it, then escaped an eighth-inning jam when slow-footed catcher Yadier Molina was running from second with two strikes on Pete Kozma. Marmol stepped off and nailed Molina chugging to third, pumping his fist as he left the mound.
Gregg came on in the ninth and pitched another clean inning.
The Cardinals entered the two-game series with a three-game lead in the NL Central, while the Cubs were in the basement, 81/2 games back. St. Louis had the lowest ERA in the majors at 3.09, as well as the best ERA (2.21) from its starters.
Lynn (5-1) made only one bad pitch in seven innings.