lxmlは文字コードを厳格に定義しており、入力時は必ず「unicode」化しておく必要があります。
これだけでも注意しておかなければならない点ですが、lxmlには、出力用の「tostring()」というメソッドを持っており、ここでも文字コードの注意が必要となってきます。
tostring()を使うと、取得した任意のDOM要素に対して文字列展開ができます。
例えば以下のような感じです。
from lxml import etree
dom = etree.fromstring(u'<p>Hello<br>world!</p>', parser=HTMLParser())
enums = dom.xpath("//p")
etree.tostring(enums[0], method='text', encoding="utf-8")
その際、「encoding」属性で出力時の文字コードを指定する必要があることに注意して下さい。
これが無いと文字化けしてしまいます。
ちなみに「tostring()」を使うとテキストを抽出する意外にXML化したりHTML化したりすることができます。
dom = etree.fromstring(u'<p>Hello<br>world!</p>', parser=HTMLParser())
enums = dom.xpath("/")
etree.tostring(enums[0], method='xml', encoding="utf-8")
>>> '<p>Hello<br/>world!</p>'
etree.tostring(enums[0], method='html', encoding="utf-8")
>>> '<p>Hello<br>world!</p>'
etree.tostring(enums[0], method='text', encoding="utf-8")
>>> 'Helloworld!'