BeautifulSoup: solo ingrese a una etiqueta, sin importar cuántas etiquetas adjuntas haya

Estoy tratando de raspar todo el html interno del<p>&nbsp;elementos en una página web usando BeautifulSoup. Hay etiquetas internas, pero no me importa, solo quiero obtener el texto interno.

Por ejemplo, para:

<p>Red</p>
<p><i>Blue</i></p>
<p>Yellow</p>
<p>Light <b>green</b></p>

¿Cómo puedo extraer:

Red
Blue
Yellow
Light green

Ninguno.string&nbsp;ni.contents[0]&nbsp;hace lo que necesito Ni tampoco.extract(), porque no quiero tener que especificar las etiquetas internas de antemano, quiero tratar con cualquiera que pueda ocurrir.

¿Hay un tipo de método 'solo obtener el HTML visible' en BeautifulSoup?

----ACTUALIZAR------

Por consejo, intentando:

soup = BeautifulSoup(open("test.html"))
p_tags = soup.findAll('p',text=True)
for i, p_tag in enumerate(p_tags): 
    print str(i) + p_tag

Pero eso no ayuda, imprime:

0Red
1

2Blue
3

4Yellow
5

6Light 
7green
8