从 Fedora 17 切换到 18 后,对于相同的 lxml 代码,我得到了不同的解析行为,这显然是由于底层库的版本不同(libxml2 和 libxslt 版本发生了变化)。
这是两个版本的不同结果的 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 版本通过了断言,即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 版本不同。
有没有办法控制这种行为?(某个地方的可选参数?)或者更好的是,有没有一种方法可以让我使用新库恢复旧行为?