Python: lxmlの文字コード(tostring())

2012年2月19日

lxmlは文字コードを厳格に定義しており、入力時は必ず「unicode」化しておく必要があります。

これだけでも注意しておかなければならない点ですが、lxmlには、出力用のtostring()というメソッドを持っており、ここでも文字コードの注意が必要となってきます。

tostring()を使うと、取得した任意のDOM要素に対して文字列展開ができます。

例えば以下のような感じです。

1
2
3
4
5
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化したりすることができます。


1
2
3
4
5
6
7
8
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!'