One of the problems is that it is not guaranteed that the length of the string is sufficient. For instance the empty string ('') or a string with one character ('s') might end up in the word list as well.
A quick fix is to use a length check:
for word in st.split():
if len(word) > 1 and word[1] == 's':
print word
Or you can - like @idjaw says - use slicing, and then we will obtain an empty string if out of range:
for word in st.split():
if word[1:2] == 's':
print word
If you have a string, you can obtain a substring with st[i:j] with st the string, i the first index (inclusive) and j the last index (exclusive). If however the indices are out of range, that is not a problem: then you will obtain the empty string. So we simply construct a slice that starts at 1 and ends at 1 (both inclusive here). If no such indices exist, we obtain the empty string (and this is not equal to 's'), otherwise we obtain a string with exactly one character: the one at index 1.
In the case however you will check against more complicated patterns, you can use a regex:
import re
rgx = re.compile(r'\b\ws\w*\b')
rgx.findall('print only the words that sstart with an s in the sstatement')
Here we specified to match anything between word boundaries \b that is a sequence of \ws with the second character an s:
>>> rgx.findall('print only the words that sstart with an s in the sstatement')
['sstart', 'sstatement']