I used to have a serious aversion to seiging, and would simply wait until garrisons sallied rather than actively take cities. But I've since developed a straightforward way of taking almost anything.
If the city is still in the wooden wall/pallisade stage, I pick the side that has a direct approach to the town square and/or fewer towers, and use four rams. Three of the rams go after the gate and the adjacent sections of wall. The fourth one goes after a wall somewhere else, simply to hold some of the enemy forces away from my main point of attack. I make sure to have at least three units of archers and two units of wardogs. The archers job is to mow down any defenders that stay near the other side of the wall that I am ramming, which will usually be at least half the force in the city. As long as the AI obliges by marching troops up and down to be shot up, I do not enter the city, but let my archers continue to attrit him.
Once the archers run out of arrows, or the AI stops sending out targets, I send in the dogs, closely followed by my assault. By this stage, the enemy general is often dead and they've taken about 50% casualties. One broken defensive charge later and its in mop up mode.
Cities with stone walls are a much tougher nut to crack and call for a highly specialized army. When I'm facing an enemy with several stone walled cities, I make an army with 6 onagers, one or two units of the heaviest cavalry I have, and the rest is all my best infantry. I don't bother with rams, sap points or siege towers, all they do is slow me down and get my men killed. I line up along the longest, flattest side of the city and destroy all the towers, the gatehouse, the gate, and blow holes in all the wall sections. Then I send the infantry in all at once. The cavalry goes whereever the enemy is not defending and starts charging the defenders that are engaging my infantry from behind. Not fancy, but it works just fine, even when the enemy forces are comparable in numbers, because half of them will be on top of the walls when your troops are coming through the gaps, and thus doing almost nothing to stop the assualt until its waaaaay too late.