Buster Posey continued his second-half tear with a three-run homer, Barry Zito pitched 6 2/3 innings of two-run ball and the San Francisco Giants defeated the St. Louis Cardinals 4-2 Tuesday night.