使用Python解析大型复杂的专利分类XML文件

问题描述 投票:0回答:2

我正在尝试解析一个大文件,尤其是英文版本的https://www.wipo.int/ipc/itos4ipc/ITSupport_and_download_area/20200101/MasterFiles/index.html,这是XML格式的专利分类。我是XML解析的新手,所以我认为这就是为什么我很难解析该文件中我真正想要的元素。

让我提供一些背景信息:

<?xml version="1.0" encoding="UTF-8"?>
<IPCScheme xmlns="http://www.wipo.int/classifications/ipc/masterfiles" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" edition="20200101" lang="EN" xsi:schemaLocation="http://www.wipo.int/classifications/ipc/masterfiles ipc_scheme_3-1.xsd">
  <ipcEntry kind="s" symbol="A" entryType="K">
    <textBody>
      <title>
        <titlePart>
          <text>HUMAN NECESSITIES</text>
        </titlePart>
      </title>
    </textBody>
    <ipcEntry kind="t" symbol="A01" endSymbol="A01" entryType="K">
      <textBody>
        <title>
          <titlePart>
            <text>AGRICULTURE</text>
          </titlePart>
        </title>
      </textBody>
    </ipcEntry>
    <ipcEntry kind="c" symbol="A01" entryType="K">
      <textBody>
        <title>
          <titlePart>
            <text>AGRICULTURE</text>
          </titlePart>
          <titlePart>
            <text>FORESTRY</text>
          </titlePart>
          <titlePart>
            <text>ANIMAL HUSBANDRY</text>
          </titlePart>
          <titlePart>
            <text>HUNTING</text>
          </titlePart>
          <titlePart>
            <text>TRAPPING</text>
          </titlePart>
          <titlePart>
            <text>FISHING</text>
          </titlePart>
        </title>
      </textBody>
.
.
</ipcEntry>
.
.
</IPCScheme>

您可以假定文件格式正确,每个分支都有完全关闭的位置。大约80万行很长,这就是为什么我不附加此代码示例中的整个文件的原因。

层次结构的简短概述应显示如下:

  1. ROOT
  2. 级别1:符号{A,B,C,D,E,F,K}
  3. 级别2:每个符号{A01,B22等中的细分}
  4. 级别3:进一步细分

然后持续到大约H05K0013040000,这是粒度复杂性的最大层。在其中一些中,它会暂停到5级左右,但是未关闭样本的原因是由于这之间的进一步细分。

任务

例如,如果我想提取HUMAN NECESSITIESAGRICULTURE,我想从该专利分类文件中提取文本描述。您可以假定所有这些细分都包含在其中,并且大多数细分在此级别上由该层次结构控制(即<title>-> <titlePart>-> <text>

在Python中使用lxml

这是我一直在尝试的示例代码:

from lxml import etree
import lxml

tree = etree.parse('EN_ipc_scheme_20200101.xml')
root = tree.getroot()


for elem in root.findall(".//*[@kind='s']"):
    body = elem.find('textBody/title/titlePart/text')
    print(body)

我的输出是

None
None
None
None
None
None
None
None
python xml lxml
2个回答
0
投票

这可能有用:)


0
投票

您显示的XML示例中每个实体的名称空间都在xmlns="http://www.wipo.int/classifications/ipc/masterfiles"下。您可以通过查看root的子级来查看。

© www.soinside.com 2019 - 2024. All rights reserved.