I had that problem all the time, too! I have tried several different things including the Dreft stain removal and Shout (though I would always wash it at least twice after to get all the harsh chemicals out). What I found works best was the Baby Oxyclean. I know you can buy it at both Target and BabiesRUs, though I'm sure you can find it elsewhere. It has always come out for M. if I rinsed the stain immediately (or as soon as I get home if we were out), squeeze out all the excess water, spray the Baby Oxyclean on it, then scrub it in with a tooth brush. I usually let it sit for at least an hour.
The only thing I would watch out for is make sure it doesn't dry on white clothes. One time I was treating a cute white onesie and forgot about it. When I went to do laundry two days later, it was dried and had turned it yellow. That has only happened once, though, and it was because I was neglectful. Otherwise, I highly recommend it!