我正在try 解析一个复杂的XML,而xpath的行为不像我想象的那样.

<project>
    <samples>
        <sample>show my balance</sample>
        <sample>show me the <subsample value='USD'>money</subsample>today</sample>
    </samples>
</project>

以下是我的python代码:

from lxml import etree

somenode="<project><samples><sample>show my balance</sample><sample>show me the <subsample value='USD'>money</subsample>today</sample></samples></project>"

somenode_etree = etree.fromstring(somenode)

for x in somenode_etree.iterfind(".//sample"):
    print (etree.tostring(x))

我得到了输出:

b'<sample>show my balance</sample><sample>show me the <subsample value="USD">money</subsample>today</sample></samples></project>'
b'<sample>show me the <subsample value="USD">money</subsample>today</sample></samples></project>'

当我预料到:

show my balance
show me the <subsample value="USD">money</subsample>today

我做错了什么?

推荐答案

此XPath将按预期获取文本和元素

result = somenode_etree.xpath(".//sample/text() | .//sample/*")
result
['show my balance', 'show me the ', <Element subsample at 0x7f0516cfa288>, 'today']

按OP请求打印找到的 node

for x in somenode_etree.xpath(".//sample/text() | .//sample/*[node()]"):
    if type(x) == etree._Element:
        print(etree.tostring(x, method='xml').decode('UTF-8'))
    else:
        print(x)

后果

show my balance
show me the 
<subsample value="USD">money</subsample>today
today

最后一个text() node 被附加到上一个元素what seems to be a bug on etree.tostring() method!

>>> for x in somenode_etree.xpath(".//sample/text() | .//sample/*"):
...     if type(x) == etree._Element:
...         print(x.text)
...     else:
...         print(x)
... 
show my balance
show me the 
money
today

Python相关问答推荐

在pandas DataFrame上运行apply()时如何访问DateTime索引?

流畅的模式,采用Escc方法

为什么我的主页不会重定向到详细视图(Django)

使用decorator 重复超载

仅对matplotlib的条标签中的一个条标签应用不同的格式

pyramid 内部数组中的连续序列-两极

pyautogui.locateOnScreen在Linux上的工作方式有所不同

添加包含中具有任何值的其他列的计数的列

如何在BeautifulSoup中链接Find()方法并处理无?

将DF中的名称与另一DF拆分并匹配并返回匹配的公司

Pydantic 2.7.0模型接受字符串日期时间或无

运行Python脚本时,用作命令行参数的SON文本

将数据框架与导入的Excel文件一起使用

Pandas - groupby字符串字段并按时间范围 Select

如何过滤包含2个指定子字符串的收件箱列名?

PyQt5,如何使每个对象的 colored颜色 不同?'

多指标不同顺序串联大Pandas 模型

Django—cte给出:QuerySet对象没有属性with_cte''''

如何使regex代码只适用于空的目标单元格

Python Tkinter为特定样式调整所有ttkbootstrap或ttk Button填充的大小,适用于所有主题