Выводит не все элементы из xml
Мне нужно из xml КПТ Росреестра вывести в одну колонку все кадастровые номера у которых имеются координаты, вторя и третья колонки это сами координаты (x и y). Дальше код:
from bs4 import BeautifulSoup
from pathlib import Path
import pandas as pd
def ordinates(ordinates):
ordinate_list = []
for x in ordinates:
cad_number = [s.find('cad_number').text for s in x.find_all('common_data')
# for ordinate in x.find_all('ordinate'):
xx = [cad.text for cad in x.find_all('x')]
yy = [cad.text for cad in x.find_all('y')]
ordinate_list.extend([(d,f,a) for d,f,a in zip(cad_number,xx,yy)])
return ordinate_list
for path in Path(file_path).rglob('*.XML'):
with open(path, 'r', encoding='utf-8') as parse:
xml = parse.read()
soup = BeautifulSoup(xml, features="lxml")
ordinate = ordinates(soup.find_all('base_data'))
for k in ordinate:
data = {'Кадастровый номер':k[0],
'Координаты по X': k[2],
'Координаты по Y': k[2]}
Выводит следующую информацию (1 кадастровый номер и по одной координате x и y, хотя у кадастрового номера этих координат может быть, для примера, 9 шт.) Дальше следующий вариант кода:
def ordinates(ordinates):
ordinate_list = []
value_list_1 = []
for x in ordinates:
cad_number = ([s.find('cad_number').text for s in x.find_all('common_data')])
value_list = ([s.find('value').text for s in x.find_all('common_data')])
value_list_1.extend([(v,b) for v,b in zip(cad_number,value_list)])
for ordinate in x.find_all('ordinate'):
xx = [cad.text for cad in ordinate.find_all('x')]
yy = [cad.text for cad in ordinate.find_all('y')]
ordinate_list.extend([(d,f) for d,f in zip(xx,yy)])
return ordinate_list
for path in Path(file_path).rglob('*.XML'):
with open(path, 'r', encoding='utf-8') as parse:
xml = parse.read()
soup = BeautifulSoup(xml, features="lxml")
ordinate = ordinates(soup.find_all('base_data'))
for k in ordinate:
data = {'Кадастровый номер':k[0],
'Вид объекта':k[1]}
Тут функция def ordinates выводит все координаты (если поставить return ordinate_list) либо все кадастровые номера (если поставить return value_list_1), а как вывести все одновременно и записать в:
data = {'Кадастровый номер':k[0],
'Координаты по X': k[2],
'Координаты по Y': k[2]}
Ссылка на КПТ в формате xml
Ответы (2 шт):
Автор решения: Armen Legran
→ Ссылка
from bs4 import BeautifulSoup
from pathlib import Path
import pandas as pd
def ordinates(ordinates):
ordinate_list = []
for x in ordinates:
cad_number = [s.find('cad_number').text for s in x.find_all('common_data')]
for ordinate in x.find_all('ordinate'):
xx = [cad.text for cad in ordinate.find_all('x')]
yy = [cad.text for cad in ordinate.find_all('y')]
ordinate_list.extend([(d,f,a) for d,f,a in zip(cad_number,xx,yy)])
return ordinate_list
data_list = []
for path in Path(file_path).rglob('*.XML'):
with open(path, 'r', encoding='utf-8') as parse:
xml = parse.read()
soup = BeautifulSoup(xml, features="lxml")
ordinate = ordinates(soup.find_all('base_data'))
for k in ordinate:
data = {'Кадастровый номер':k[0],
'Координаты по X': k[1],
'Координаты по Y': k[2]}
data_list.append(data)
df = pd.DataFrame(data_list)
Автор решения: Михаил Ширшов
→ Ссылка
Пришлось переписать еще раз, аккуратно... получилось что хотел)) вот код:
for path in Path(file_path).rglob('*.XML'):
with open(path, 'r',encoding='utf-8-sig') as parse:
xml = parse.read()
soup = BeautifulSoup(xml, features="xml")
child_ZY = soup.find_all('land_record')
data_excel = []
for value in child_ZY:
if value.select_one('contours_location x') is not None:
cad_n = (value.select_one('common_data cad_number').text)
x = [cad.text for cad in value.find_all('x')]
y = [cad.text for cad in value.find_all('y')]
pairs = list(zip(x, y))
coords = [{"Кадастровый номер": cad_n, "Координаты x": pair[0], "Координаты y": pair[1]} for pair in pairs]
data_excel.extend(coords)
df = pd.DataFrame(data_excel)
columns = ["Кадастровый номер", "Координаты x", "Координаты y"]
df = pd.DataFrame(data_excel, columns=columns)
df.to_excel(excel_file, index=False)