Luis Pujols went 0-for-3 and struck out twice in his first game against the Cardinals, with whom he made a name for himself before signing a mega contract with the Angels two seasons ago.
Weaver (2-4) allowed one run on six hits and struck out five while not issuing a walk and earned his first victory since May 29.
The Angels scored all of their runs in the second inning. The inning began with four consecutive singles off Lance Lynn (10-3). One run scored on an error by second baseman Matt Carpenter.
St. Louis loaded the bases in the eighth inning but David Freese hit into a double play to end the threat.
Los Angeles won its seventh consecutive game. The tepid Cards fell for the seventh time in nine starts.