Вобщем, проблема оказалась в странном поведении chardet:
>>> cchardet.detect('Hyvä juoni'.encode())
{'confidence': 0.8032709360122681, 'encoding': 'WINDOWS-1252'}
>>> cchardet.detect('Hyv juoni'.encode())
{'confidence': 0.0, 'encoding': 'ASCII'}
>>> cchardet.detect('ä'.encode())
{'confidence': 0.5049999952316284, 'encoding': 'UTF-8'}
Пока лучшее, что придумал, это вручную задавать кодировку контента, если она известна.
fragment = fromstring(content, parser = lxml.html.HTMLParser(encoding='utf-8'))
А вот если кодировка неизвестна, и при этом неверно определяется при помощи chardet, то решения я пока не вижу.