Fedora 17 から 18 に切り替えた後、基盤となるライブラリのバージョンが異なる (libxml2 と libxslt のバージョンが変更された) ため、同じ lxml コードに対して異なる解析動作が得られます。
2 つのバージョンで結果が異なる lxml コードの例を次に示します。
from io import BytesIO
from lxml import etree
myHtmlString = \
'<!doctype html public "-//w3c//dtd html 4.0 transitional//en">\r\n'+\
'<html>\r\n'+\
'<head>\r\n'+\
' <title>Title</title>\r\n'+\
'</head>\r\n'+\
'<body/>\r\n'+\
'</html>\r\n'
myFile = BytesIO(myHtmlString)
myTree = etree.parse(myFile, etree.HTMLParser())
myTextElements = myTree.xpath("//text()")
myFullText = ''.join([myEl for myEl in myTextElements])
assert myFullText == 'Title', repr(myFullText)
f17 バージョンは assert に合格します。つまり、xpath("//text()")
text のみを返します'Title'
が、f18 バージョンは出力で失敗します。
Traceback (most recent call last):
File "TestLxml.py", line 17, in <module>
assert myFullText == 'Title', repr(myFullText)
AssertionError: '\r\n\r\n Title\r\n\r\n\r\n'
どうやら、f18 バージョンは f17 バージョンとは異なる方法で改行と空白を処理します。
この動作を制御する方法はありますか? (どこかのオプションの引数?) または、新しいライブラリを使用して古い動作を元に戻す方法はありますか?