Python 3x: проанализировать файл xml с пространствами имен, используя python xml .etree - PullRequest
1 голос
/ 13 июля 2020

Я пытаюсь разобрать большой xml файл, используя xml.etree. Он имеет следующую структуру.

enter image description here

I am particularly interested in extracting References with Title an Publisher as shown in the following image.

enter image description here

The following is the code sample that I tried. It doesn't print anything. Any help is appreciated.

import xml.etree.ElementTree as et

data = """  November_2019_Timaru_Hail  Ноябрь 2019 Timaru Hail  2019-11-20  Сильный град над Тимару с градом размером с мяч для гольфа нанес значительный ущерб зданиям и транспортные средства.   -44.398445 171.255200  Сумма страховых возмещений составила 130,7 миллиона долларов.  Крупные камни, вызванные градом, были разбиты windows, забиты дырами в крышах, повреждены автомобили и вызвали закрытие предприятий.  Командующий пожарной и чрезвычайной ситуацией в Новой Зеландии на юге Кентербери сказал, что они получили 30 вызовов с полудня до 14.40. Двадцать один из них был нанесен градом или дождем.  Торговая палата Южного Кентербери заявила, что был нанесен значительный ущерб и был нанесен наводнение, в результате чего ряд предприятий были вынуждены закрыться до тех пор, пока их помещения не станут безопасными и безопасными для открытия. Библиотека Тимару и Художественная галерея Айгантиге были закрыты из-за нанесенного ущерба.  По оценкам компании, занимающейся избиением панелей в Тимару, в Тимару было повреждено не менее 10 000 автомобилей. У автомобилей были вмятины, разбиты лобовые стекла и разбиты зеркала заднего вида. Было обнаружено, что структурная целостность многих поврежденных автомобилей нарушена.  Базирующаяся в Австралии группа специалистов по ремонту повреждений, вызванных градом, создала базу в Тимару, чтобы ремонтировать автомобили, поврежденные во время града. Они ожидали, что ремонт поврежденных градом автомобилей в Тимару займет не менее шести месяцев.    -44,5301 171,1909  Федеративные фермеры сообщили, что вблизи Сент-Эндрюс был нанесен значительный ущерб урожаю.        Страховой совет Новой Зеландии (https://www.icnz.org.nz/natural-disasters/cost-of-natural-disasters/)  Ссылка    Заголовок: Гигантские градовые камни забивают Тимару, когда шторм движется вверх по стране.  Ссылка  www.stuff.co.nz, 20 ноября 2019 г.    Заголовок: Страховые компании сталкиваются с огромным потоком требований о возмещении ущерба от града.  Ссылка  www.stuff.co.nz, 21 ноября 2019 г.    Заголовок: Автомобили, поврежденные во время сильного ливня с градом в Тимару, не соответствуют требованиям пригодности.  Ссылка  www.stuff.co.nz, 4 декабря 2019 г.    Заголовок : Рекордный страховой ремонт автомобилей, разбитых градом в Тимару.  Справка  www.stuff.co.nz, 23 декабря 2019.    "" "root = et.fromstring (data) ns = {'exist': 'http://exist.sourceforge.net/NS/exist', 'niwa': 'http://hwe.niwa.co.nz/schema/2011'} results = root .findall ('exist: result', ns) для события в результатах: weatherEvnt = event.find ('niwa: events', ns) для WE в weatherEvnt: Ref = WE.find ('niwa: WeatherEvent', ns) для x в Ref.find ('niwa: Ссылки ', нс): print (x.text) 

1 Ответ

1 голос
/ 13 июля 2020

Проблемы включают как минимум:

  1. root уже exist:result, поэтому начальный

    results = root.findall('exist:result', ns)
    

    возвращает пустой список, потому что exist:result не имеет таких дочерних элементов.

  2. После двоеточия, следующего за префиксом пространства имен и его локальным именем, не должно быть пробелов. Например, niwa: events должно быть niwa:events et. al.

  3. Нет текстовых дочерних элементов niwa:References.

Точно не знаю, какова ваша конечная цель, но этот код,

import xml.etree.ElementTree as et

data = "" # As specified in question.

root = et.fromstring(data)
ns = {'exist':'http://exist.sourceforge.net/NS/exist',
      'niwa':'http://hwe.niwa.co.nz/schema/2011'}

for ref in root.findall('.//niwa:Title', ns):
  print('Title='+ref.text)

продемонстрирует успешный выбор текста в пространстве имен XML и выведет:

Title= November 2019 Timaru Hail
Title=Insurance Council of New Zealand (https://www.icnz.org.nz/natural-disasters/cost-of-natural-disasters/)
Title=Headline:  Giant hail stones hammer Timaru as storm moves up the country.
Title=Headline:  Insurance companies face deluge of hail damage claims.
Title=Headline:  Cars damaged in severe Timaru hailstorm failing warrents of fitness.
Title=Headline:  Record insurance repairs for cars smashed by hail in Timaru.
...