Найти тему

Web Scraping: преобразование иерархической структуры в табличную

Оглавление

Задача

Есть файл XML. Необходимо его преобразовать к табличной форме, выделив один из элементов Элемент1 в качестве строки будущей таблицы и добавив в качестве новых колонок выбранные элементы Элемент2,.., ЭлементN, по отношению к которым Элемент1 является подчиненным. Формулировка станет яснее на примере.

<?xml version="1.0"?>
<root>
<u>Городищенский уезд
<f>ф.158 оп.3 д.2612
<v>Аришкинская волость
<s>село Аришка
<p>Абрамов Сергей Матвеевич</p>
<p>Агапов Лаврентий Степанович</p> ...

Здесь разные строки несут разную информацию. Одни из них - заголовочные - относятся к нескольким нижележащим строкам. Другие - основные

Для этого файла надо создать табличную форму на базе элемента <p>, вставив в него элементы <u>,<v>,<s>,<f>. Это должно выглядеть так

Абрамов Сергей Матвеевич_Городищенский уезд_Аришкинская волость_село Аришка_ф.158 оп.3 д.2612
Агапов Лаврентий Степанович_Городищенский уезд_Аришкинская волость_село Аришка_ф.158 оп.3 д.2612
...

Колонки разделены подчеркиванием (чтобы удобнее было полученную таблицу импортировать в Эксель). Строки не зависят друг от друга, поскольку вся информация, относящаяся к строке, добавлена к ней в виде одной из колонок. Поэтому полученный файл можно сортировать, переупорядочивать, фильтровать - без потери информационной целостности.

Программа на языке Python

import xml . etree . ElementTree as ET
import re
dir  =  'f:/'
g  =  open ( dir + 'Таблица.txt' ,  'w' ,  encoding = 'utf-8' )
tree  =  ET . parse(dir + "Структура.xml")
root  =  tree . getroot()
data  = {};  k = 0 ;
def read ( elem ):
global data ,  k
tag = elem .tag
if elem .text  is not None :
text  =  re . sub ( "^\s+| \n | \r |\s+$" , '' , elem .text)
else :
text  =  ''
if tag in  [ 'f' , 'u' , 'v' , 's' ]:
data [ tag ] =  text
elif tag == 'p' :
k += 1
g . write ( ' {0:06d} ' . format ( k )+ '_' + text + '_' + data [ 'u' ]+ '_' + data [ 'v' ]+ '_' + data [ 's' ]+ '_' + data [ 'f' ]+ ' \n ' )
for chil in elem :
read( chil )
read( root )
print( 'finished' )

Программа открывает на чтение файл XML и получает из него корневой элемент.

Затем выполняется функция read, которая проходит по всем элементам.

Встречая элементы из списка [ 'f' , 'u' , 'v' , 's' ] , т.е. "заголовочные" элементы, она запоминает их текстовые значения. А встречая "основной" элемент 'p', выводит в результирующий файл очередную строку с добавлением к тексту основного элемента текстов всех запомненных ранее заголовочных элементов.

Функция рекурсивно вызывается для всех подчиненных элементов, если такие есть.

Для нашего исходного файла на выходе получается файл следующего вида

000001_Абрамов Сергей Матвеевич_Городищенский уезд_Аришкинская волость_село Аришка_ф.158 оп.3 д.2612
000002_Агапов Лаврентий Степанович_Городищенский уезд_Аришкинская волость_село Аришка_ф.158 оп.3 д.2612
000003_Агапов Степан Васильевич_Городищенский уезд_Аришкинская волость_село Аришка_ф.158 оп.3 д.2612
000004_Агапов Трофим Савельевич_Городищенский уезд_Аришкинская волость_село Аришка_ф.158 оп.3 д.2612
000005_Агапов Федор Васильевич_Городищенский уезд_Аришкинская волость_село Аришка_ф.158 оп.3 д.2612
000006_Агеев Варлаам Феодорович_Городищенский уезд_Аришкинская волость_село Аришка_ф.158 оп.3 д.2612
000007_Агеев Егор Феодорович_Городищенский уезд_Аришкинская волость_село Аришка_ф.158 оп.3 д.2612
000008_Агеев Николай Харитонович_Городищенский уезд_Аришкинская волость_село Аришка_ф.158 оп.3 д.2612
...

Такой файл, в отличие от исходного уже легко загрузить в Эксель, поскольку все его строки имеют одинаковую структуру.

Счастливого серфинга!

Подписаться на канал Математика и программирование
Вокруг ЕГЭ: разложить x^5+1 на множители с вещественными коэффициентами
Web Scraping: преобразовать иерархическую структуру в табличную
Web Scraping: преобразовать табличную структуру в иерархическую
Web Scraping: всероссийская перепись 1917
Как я поженил Лагранжа и сигмоиду
Интерполяция функций и правило Лопиталя

Подписаться на канал Новости из царской России
Вокруг ЕГЭ: разложить x^5+1 на множители с вещественными коэффициентами
Web Scraping: преобразовать иерархическую структуру в табличную
Web Scraping: преобразовать табличную структуру в иерархическую
Web Scraping: всероссийская перепись 1917
Как я поженил Лагранжа и сигмоиду

Оглавление статей канала "Новости из царской России"

YouTube "Новости из царской России"

Обсудить в групповом чате

News from ancient Russia

Персональная история русскоязычного мира