gpt4 book ai didi

python - 使用 xpath 给定相邻节点的文本,获取 XML 节点的文本

转载 作者:行者123 更新时间:2023-12-01 01:48:35 25 4
gpt4 key购买 nike

SO 上的几篇文章很有帮助,但我还没有找到能回答这个特定问题的文章。

我正在使用 python3 和 lxml.etree

给定 XML:

<collection xmlns="http://www.loc.gov/MARC21/slim">
<record>
<datafield tag="856" ind1="4" ind2=" ">
<subfield code="y">English</subfield>
<subfield code="s">387115</subfield>
<subfield code="u">
http://some_url/record/1475606/files/COOLPDF-EN.pdf
</subfield>
</datafield>
</record>
</collection>

一个集合包含数百条记录和几十个数据字段(这些都是非常神秘的国会图书馆的东西)

如果数据字段具有标签 856 并且具有文本为英语的子字段,我希望节点子字段代码 =“u”处的链接文本。

我已经尝试过:

import lxml.etree as ET
ns = '{http://www.loc.gov/MARC21/slim}'
tree = ET.parse('example.xml')
root = tree.getroot()
eng = root.findall(
'.//{0}datafield[@tag="856"]/[{0}descendant::text="English"]/[{0}following-sibling::code="u"]'.format(ns))
print([e.text for e in eng])

但这只是给了我一个空列表。

感谢任何帮助。

TIA

最佳答案

您的 XPath 有几个问题。

首先,你不能输入 predicate ([]) 直接位于 / 之后。

其次,descendant::text 选择一个名为 text 的后代元素(您的 XML 中没有该元素)。同样,following-sibling::code 选择名为 code 的元素,而不是属性。

试试这个:

eng = root.findall('.//{0}datafield[@tag="856"][{0}subfield="English"]/{0}subfield[@code="u"]'.format(ns))

如果您想使用更复杂的 XPath,请改用 xpath()。例如,如果您只想检查文本 Englishcode 属性值为“y”的 subfield 元素,您可以这样做(这会导致使用 findall() 时出现无效谓词错误):

eng = root.xpath('.//s:datafield[@tag="856"][s:subfield[@code="y"]="English"]/s:subfield[@code="u"]', namespaces=ns)

此外,处理命名空间的方式没有任何问题,但我发现将前缀映射到命名空间 uri 更容易;特别是当有多个命名空间时。

示例...

ns = {'s': 'http://www.loc.gov/MARC21/slim'}
eng = root.findall('.//s:datafield[@tag="856"][s:subfield="English"]/s:subfield[@code="u"]', namespaces=ns)

关于python - 使用 xpath 给定相邻节点的文本,获取 XML 节点的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50973241/

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