C, 233 bytes
-

    char*t="  0 _ _0 ___0 _ _   0_. (0=./_0=._*0=.\\_0_. ) 4 \\  (2.oO-1,._ 3.oO-)5 /  4< / (6 ]> 6:   6 [< )5> \\  (7 \"_ 7: _ 7 \"_ ) ";i,r,d;f(char*p){for(;r<35;++r){d=t[i]-48;putchar(t[d<0?i:i+p[d]-48]);i+=d<0?1:5;r%7-6?0:puts("");}}

With newlines and whitespace for better readability:

    char* t = "  0 _ _0 ___0 _ _   0_. (0=./_0=._*0=.\\_0_. ) 4 \\  (2.oO-1,._ 3.oO-)5 /  4< / (6 ]> 6:   6 [< )5> \\  (7 \"_ 7: _ 7 \"_ ) ";
    i, r, d;
    f(char* p)
    {
        for ( ; r < 35; ++r)
        {
            d = t[i] - 48;
            putchar(t[d < 0 ? i : i + p[d] - 48]);
            i += d < 0 ? 1 : 5;
            r % 7 - 6 ? 0 : puts("");
        }
    }

The whole thing is fairly brute force. It uses a table that contains one entry for each of the 35 (5 lines with length 7) characters. Each entry in the table is either:

* A constant character: ` `, `(`, `)`. Length of table entry is 1 character.
* Index of body part, followed by the 4 possible characters depending on the part selection in the input. Length of table entry is 5 characters.

The code then loops over the 35 characters, and looks up the value in the table.

Looking at this now, I think I can save at least 3 more characters.