我有大约XML个由以下xml struct 的许多代表组成:

<record>
<header>
<identifier>oai:dnb.de/dnb:reiheO/1254645608</identifier><datestamp>2022-04-01T23:49:32Z</datestamp>
<setspec>dnb:reiheO</setspec>
</header>
<metadata>
<dc xmlns="http://www.openarchives.org/OAI/2.0/oai_dc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dnb="http://d-nb.de/standards/dnbterms" xmlns:tel="http://krait.kb.nl/coop/tel/handbook/telterms.html">
<dc:title>Advantages of Simultaneous In Situ Multispecies Detection for Portable Emission Measurement Applications / Luigi Biondo, Henrik Gerken, Lars Illmann, Tim Steinhaus, Christian Beidl, Andreas Dreizler, Steven Wagner</dc:title>
<dc:creator>Biondo, Luigi Verfasser]</dc:creator>
<dc:creator>Gerken, Henrik [Verfasser]</dc:creator>
<dc:creator>[Illmann, Lars [Verfasser]</dc:creator>
<dc:creator>Steinhaus, Tim [Verfasser]</dc:creator>
<dc:creator>Beidl, Christian [Verfasser]</dc:creator>
<dc:creator>Dreizler, Andreas [Verfasser]</dc:creator>
<dc:creator>Wagner, Steven [Verfasser]</dc:creator>
<dc:publisher>Darmstadt : Universitäts- und Landesbibliothek</dc:publisher>
<dc:date>2022</dc:date>
<dc:language>eng</dc:language>
<dc:identifier xsi:type="tel:URN">urn:nbn:de:tuda-tuprints-210508</dc:identifier>
<dc:identifier xsi:type="tel:URL">http://nbn-resolving.de/urn:nbn:de:tuda-tuprints-210508</dc:identifier>
<dc:identifier xsi:type="tel:URL">http://d-nb.info/1254645608/34</dc:identifier>
<dc:identifier xsi:type="tel:URL">http://tuprints.ulb.tu-darmstadt.de/21050/</dc:identifier>
<dc:identifier xsi:type="dnb:IDN">1254645608</dc:identifier>
<dc:subject>670 Industrielle und handwerkliche Fertigung</dc:subject>
<dc:rights>lizenzfrei</dc:rights>
<dc:type>Online-Ressource</dc:type>
</dc>
</metadata>
</record>

能够处理大多数元素并提取其中的信息,但无法到达我必须定义属性的特定元素.我想我正在和xpath人作斗争,但不太明白为什么.

如果我try 这段代码,我确实会得到一个元素列表,但它是空的:

urn = xml.find_all('.//dc:identifier[@xsi:type="tel:URN"]', namespaces=ns)

对于不太具体的版本也会发生同样的情况:

urn = xml.find_all('.//dc:identifier', namespaces=ns)  

然而,这段代码: test1 = xml.find_all("dc:identifier")工作并返回一个可爱的元素列表,但显然不仅仅是指定为urn的标识符列表.

但是这个:urn = xml.find_all('dc:identifier[@xsi:type="tel:URN"]', namespaces=ns)再次返回一个空列表.无论我try 什么组合,我要么得到一个空列表,要么根本不起作用.

有没有人知道为什么会这样,或者我可以try 其他什么?获取所有ID的列表,但却无法从xsi:type中 Select 所需的ID,这太令人沮丧了...

编辑:

我通过OAI获取数据,使用以下库,使用requestsBeautifulSoup.我也试过ElementTreelxml.

我实际上只是将来自API的响应存储在一个名为"xml"的变量中,然后try 以下代码,其中一些代码有效,一些代码无效:

ids = xml.find_all("identifier")[0].text
print(ids)

urn1 = xml.find_all("dc:identifier")
urn1 = urn1[0].text
print(urn1)

test1 = xml.find_all("dc:identifier")
print(test1)

urn2 = xml.find_all(".//dc:identifier")
print(urn2)

urn3 = xml.find_all("dc:identifier[@xsi:type='tel:URN']")
print(urn3)

前两部分按预期返回元素的文本(我知道第一部分是标题中的独立元素,而不是第一个dc:identifier对象,这只是用于测试目的),第三部分返回所有元素的列表.另一方面,最后两个返回空列表,这就是问题所在(因为我需要在上次try 中指定的特定xsi:type元素.

推荐答案

首先,由于没有声明xsi前缀,xml的格式仍然不好.我在下面做了一个声明,只是为了让答案起作用.

其次,需要使用像lxml这样的xml解析器来使用xpath.

总之:

rec = """[your xml above, but with the first dc element now reading:
<dc xmlns="http://www.openarchives.org/OAI/2.0/oai_dc/" xmlns:xsi="whatever" ...]"""

from lxml import etree
doc = etree.XML(rec)
ns = {"dc":"http://purl.org/dc/elements/1.1/",
      "xsi":"whatever"}
urn2 = doc.xpath("//dc:identifier/text()",namespaces=ns)
urn3 = doc.xpath("//dc:identifier[@xsi:type='tel:URN']/text()",namespaces=ns) 

这样就可以了

Python相关问答推荐

如何标记Spacy中不包含特定符号的单词?

查找两极rame中组之间的所有差异

pandas滚动和窗口中有效观察的最大数量

管道冻结和管道卸载

在Mac上安装ipython

如何在solve()之后获得症状上的等式的值

实现自定义QWidgets作为QTimeEdit的弹出窗口

利用Selenium和Beautiful Soup实现Web抓取JavaScript表

从Windows Python脚本在WSL上运行Linux应用程序

剪切间隔以添加特定日期

使用字典或列表的值组合

mdates定位器在图表中显示不存在的时间间隔

一个telegram 机器人应该发送一个测验如何做?""

Python如何导入类的实例

修改.pdb文件中的值并另存为新的

如何将一个文件的多列导入到Python中的同一数组中?

类型对象';敌人';没有属性';损害';

正在try 让Python读取特定的CSV文件

极点用特定值替换前n行

奇怪的Base64 Python解码