Разбор XPath в нестандартном XML с использованием lxml Python - PullRequest
1 голос
/ 27 февраля 2012

Я пытаюсь создать базу данных всей патентной информации из Google Patents.До сих пор большая часть моей работы использовала этот очень хороший ответ от MattH из Python для анализа нестандартного XML-файла .Мой Python слишком велик для отображения, поэтому он связан здесь .

Здесь находятся исходные файлы : набор XML-файлов, добавляемых вместе в один файл с несколькими заголовками. Проблема заключается в попытке использовать правильное выражение xpath при анализе этого нестандартного "нестандартного""XML-файл с несколькими объявлениями xml и dtd.Я пытался использовать "-".join(doc.xpath, чтобы связать все вместе, когда его проанализировали, но вывод создает пробелы, разделенные дефисами для <document-id> и <classification-national>, показанных ниже

<references-cited> <citation> 
<patcit num="00001"> <document-id>
<country>US</country> 
<doc-number>534632</doc-number> 
<kind>A</kind>
<name>Coleman</name> 
<date>18950200</date> 
</document-id> </patcit>
<category>cited by examiner</category>
<classification-national><country>US</country>
<main-classification>249127</main-classification></classification-national>
</citation>

Примечание не все дети существуют в каждом <citation>, иногда их вообще нет.

Как я могу проанализировать этот xpath при попытке поместить дефисы между каждой записью данных для нескольких записей в <citation>?

1 Ответ

1 голос
/ 27 февраля 2012

Из этого XML (reference.xml)

<references-cited> 
  <citation> 
    <patcit num="00001"> 
      <document-id>
        <country>US</country> 
        <doc-number>534632</doc-number> 
        <kind>A</kind>
        <name>Coleman</name> 
        <date>18950200</date> 
      </document-id> 
    </patcit>
    <category>cited by examiner</category>
    <classification-national>
      <country>US</country>
      <main-classification>249127</main-classification>
    </classification-national>
  </citation>

  <citation>
    <patcit num="00002">
      <document-id>
        <country>US</country>
        <doc-number>D28957</doc-number>
        <kind>S</kind>
        <name>Simon</name>
        <date>18980600</date>
      </document-id>
    </patcit>
    <category>cited by other</category>
  </citation>
</references-cited>

Вы можете получить текстовое содержимое каждого потомка <citation>, имеющего любое содержимое, следующим образом:

from lxml import etree

doc = etree.parse("references.xml")
cits = doc.xpath('/references-cited/citation')

for c in cits:
    descs = c.xpath('.//*')
    for d in descs:
        if d.text and d.text.strip():
            print "%s: %s"  %(d.tag, d.text)
    print

Выход:

country: US
doc-number: 534632
kind: A
name: Coleman
date: 18950200
category: cited by examiner
country: US
main-classification: 249127

country: US
doc-number: D28957
kind: S
name: Simon
date: 18980600
category: cited by other

Этот вариант:

import sys
from lxml import etree

doc = etree.parse("references.xml")
cits = doc.xpath('/references-cited/citation')

for c in cits:
    descs = c.xpath('.//*')
    for d in descs:
        if d.text and d.text.strip():
            sys.stdout.write("-%s"  %(d.text))
    print

приводит к выводу:

-US-534632-A-Coleman-18950200-cited by examiner-US-249127
-US-D28957-S-Simon-18980600-cited by other
...