For an anxious few minutes, Beanie Wells looked as if he might be a leading culprit in the ugliest home loss yet for the Arizona Cardinals.

GLENDALE, Ariz. — For an anxious few minutes, Beanie Wells looked as if he might be a leading culprit in the ugliest home loss yet for the Arizona Cardinals.

The rookie's personal foul penalty had pushed the Cardinals back from the Seattle 4 to the 19 in their drive for the tying touchdown. Yet four plays later, on fourth-and-1 at the 10, Wells plunged into the plugged center of the line, then bounced outside and raced to the end zone.

Moments later, he burst up the middle and made a spin move through a defender at the goal line on a 13-yard touchdown run that put Arizona ahead for good.

The Cardinals won 31-20 on Sunday and Wells polished his status as the dynamic young runner the team has so sorely needed.

"I'd say he redeemed himself a little bit," coach Ken Whisenhunt said.

The Seahawks led 14-0 early and were up 17-10 at the half, but Arizona outscored the visitors 21-3 in the final two quarters.

"Parts of the first half seemed so difficult for us to do anything," Warner said, "then we came back in the second half and sometimes it seemed almost easy."

Warner completed 29 of 38 for 340 yards and two touchdown passes for the Cardinals (6-3), who stayed two games up on San Francisco in the NFC West.

The 38-year-old quarterback became the 29th player in NFL history to throw 200 touchdown passes. He had his 51st 300-yard passing game, tying Dan Fouts for fourth on the NFL career list.

"It was a big game for us to establish ourselves in our division," said Anquan Boldin, who caught eight passes for 105 yards a week after he was inactive, much to his displeasure, because of a sprained ankle. "All week we heard about what they were going to do when they were healthy."

The Seahawks (3-6) did put up a much better fight than they did at home on Oct. 18, when they managed just 14 yards rushing and were 0 for 11 on third downs in a 27-3 loss.

"I think when we look back at this we'll see that we did improve as a football team today," coach Jim Mora said, "but it's not good enough yet, not good enough to beat these guys yet."

With Julius Jones out early with a chest injury, second-year back Justin Forsett rushed for a career-high 123 yards, including an 11-yard touchdown run, for the Seahawks (3-6). Mora said Jones has a broken rib and would spend the night in a local hospital as a precaution.

Matt Hasselbeck, who had been bothered by a sore shoulder, was 26 of 52 for 315 yards and a touchdown. He was picked off twice late in the game.

"The shoulder is OK. It's the same, no worse," he said. "I felt like last week I didn't really have much to offer, by way of zip on the ball, but I felt much better this week."

Wells gained a career-best 85 yards on 16 carries and caught two passes for 32 yards. He had 75 yards on 10 carries in the second half. Wells' 29-yard run set up Arizona's final TD, Warner's 18-yard pass to Larry Fitzgerald.

"I think we all see why we drafted him where we did," Warner said, "and what he brings to the table and the power and the strength and explosion that he brings to an offense."

Down 17-10, the Cardinals took the second-half kickoff and went 82 yards in 13 plays, ending with Wells' 10-yard run. The personal foul penalty came when he was shoved by Seattle's Deon Grant, then got caught shoving back.

"Oh man, that was terrible," Wells said. "I've never in my life got mad like that on the field because I'm always smiling. That's one of the times I wasn't smiling."

Moments later, the Cardinals held when Seattle had first-and-goal at the 1, and the Seahawks had to settle for Olindo Mare's 20-yard field goal to go ahead 20-17.

"That was a big stand, man," defensive Darnell Dockett said. "... It was big for our offense, our team morale."

The Seahawks stopped Tim Hightower on fourth-and-goal at their 1, then went 99 yards for the game's first score. Hasselbeck threw 53 yards to T.J. Houshmandzadeh, then a facemask penalty added 15 yards to the play.

It was one of 11 penalties, for 136 yards, called against Arizona. Seattle was penalized nine times for 113 yards.

"Things didn't go our way," Fitzgerald said. "It wasn't the prettiest victory we've had, but to be able to win and protect our home field, it means a lot."