The Phillies twice came from behind to tie the contest, but they had no answer for Beltran's second home run of the season. Philadelphia failed to capitalize on a great chance in the ninth after putting its first two batters on base.
Yadier Molina had three hits and drove in two runs for the Cardinals. The win went to Adam Wainwright (3-1), who limited Philadelphia to three runs while giving up nine hits in seven innings. Wainwright had thrown a four-hit shutout against Milwaukee in his previous outing.
Philadelphia has lost four in a row, the previous three setbacks having come against Cincinnati.
Molina doubled home two runs in the fourth to break a scoreless tie, but Philadelphia tied it in the sixth on run-scoring hits from Freddy Galvis and Chase Utley.
The Cardinals regained the lead in the seventh on a sacrifice fly from Pete Kozma, but the Phillies again knotted the score in the bottom half of the inning when Erik Kratz singled home John Mayberry.
Adams (0-1) took the loss in relief of Cole Hamels.
Edward Mujica worked the final 1 1/3 innings for the Cardinals and escaped a major jam in the ninth to earn his first save.
The Phillies put runners on first and third with nobody out, but none of the next three batters could get the ball out of the infield.