gpt4 book ai didi

python - 如何控制 lxml xpath text() 函数中的换行处理?

转载 作者:行者123 更新时间:2023-12-03 15:41:33 25 4
gpt4 key购买 nike

从 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()")只返回文本 '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 版本不同。

有没有办法控制这种行为? (某个地方的可选参数?)
或者更好的是,有没有办法可以使用新库恢复旧行为?

最佳答案

在 XML 中, text() 按原样返回标签内的文本(未剥离),因此如果您有任何空白字符、制表符、新行,它们将被包含在内。

可能是您使用 + 和\n\r 构造多行字符串的方式不小心测试了两个不同的字符串。

如果您将字符串更改为如下例所示的三引号字符串并进行测试。

from io import BytesIO
from lxml import etree


html = '''
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>Title</title>
</head>
<body/>
</html>
'''
tree = etree.parse(BytesIO(html), etree.HTMLParser())
text_elements = tree.xpath("//text()")
full_text = ''.join(text_elements)
assert full_text == 'Title', repr(full_text)

您还可以看到用空格或新行包围文本使它们成为 text() 函数返回的一部分。见 title以下。
html = '''
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title> Title </title>
</head>
<body/>
</html>
'''
tree = etree.parse(BytesIO(html), etree.HTMLParser())
text_elements = tree.xpath("//text()")
full_text = ''.join(text_elements)
assert full_text == ' Title ', repr(full_text)

如果您不需要空格,您总是可以自己在字符串上调用 strip() 。如果您确定即使您的标签不包含空格,您也会得到空格,那么您应该将其报告为 lxml mailing list 上的错误。 .

关于python - 如何控制 lxml xpath text() 函数中的换行处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16123277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com