Проблема спарсить из XML с помощью BS4
Помогите пожалуйста с такой проблемой. У меня есть xml файл с такой структурой:
<?xml version="1.0">
<extract_cadastral_plan_territory>
<details_statement>
<group_top_requisites>
<organ_registr_rights></organ_registr_rights>
<date_formation>2022-12-02</date_formation>
<registration_number>****-***/****-*********</registration_number>
</group_top_requisites>
</details_statement>
<details_request>
<date_received_request>2022-12-02</date_received_request>
<date_receipt_request_reg_authority_rights>2022-12-02</date_receipt_request_reg_authority_rights>
</details_request>
<cadastral_blocks>
<cadastral_block>
<cadastral_number>52:18:0010180</cadastral_number>
<area_quarter>
<area>1.1</area>
<unit>059</unit>
</area_quarter>
<land_record>
<object>
<common_data>
<type>
<code>002001001000</code>
<value>Земельный участок</value>
</type>
<cad_number>52:18:0010180:1</cad_number>
</common_data>
<subtype>
<code>01</code>
<value>Землепользование</value>
</subtype>
</object>
<params>
<category>
<type>
<code>003002000000</code>
<value>Земли населенных пунктов</value>
</type>
</category>
<permitted_use>
<permitted_use_established>
<by_document>Жилой частный сектор</by_document>
</permitted_use_established>
</permitted_use>
<permittes_uses_grad_reg>
<reg_numb_border>52:00-7.1</reg_numb_border>
</permittes_uses_grad_reg>
<area>
<value>438</value>
<inaccuracy>7</inaccuracy>
</area>
</params>
<address_location>
<address_type>
<code>01</code>
<value>Установленный</value>
</address_type>
<address>
<address_fias>
<level_settlement>
<fias>6a7510ae-0e9d-4e74-a36f-57fe370a5149</fias>
<okato>22401382000</okato>
<kladr>52000001000103800</kladr>
<oktmo>22701000001</oktmo>
<postal_code>603040</postal_code>
<region>
<code>52</code>
<value>Нижегородская область</value>
</region>
<city>
<type_city>г</type_city>
<name_city>Нижний Новгород</name_city>
</city>
</level_settlement>
<detailed_level>
<street>
<type_street>пер</type_street>
<name_street>Сочинский</name_street>
</street>
<level1>
<type_level1>уч</type_level1>
<name_level1>1</name_level1>
</level1>
</detailed_level>
</address_fias>
<readable_address>Российская Федерация , Нижегородская обл, городской округ город Нижний Новгород , г Нижний Новгород, пер Сочинский, земельный участок 1</readable_address>
</address>
</address_location>
<cost>
<value>1010106.84</value>
</cost>
</land_record>
</cadastral_block>
</cadastral_blocks>
</extract_cadastral_plan_territory>
Не удается получить площадь объекта (именно из файла), использую вот такой код:
from bs4 import BeautifulSoup
from pathlib import Path
file_path = r"C:\Users\shirshov\Desktop\2"
fg = '''<?xml version="1.0">
<extract_cadastral_plan_territory>
<details_statement>
<group_top_requisites>
<organ_registr_rights></organ_registr_rights>
<date_formation>2022-12-02</date_formation>
<registration_number>****-***/****-*********</registration_number>
</group_top_requisites>
</details_statement>
<details_request>
<date_received_request>2022-12-02</date_received_request>
<date_receipt_request_reg_authority_rights>2022-12-02</date_receipt_request_reg_authority_rights>
</details_request>
<cadastral_blocks>
<cadastral_block>
<cadastral_number>52:18:0010180</cadastral_number>
<area_quarter>
<area>1.1</area>
<unit>059</unit>
</area_quarter>
<land_record>
<object>
<common_data>
<type>
<code>002001001000</code>
<value>Земельный участок</value>
</type>
<cad_number>52:18:0010180:1</cad_number>
</common_data>
<subtype>
<code>01</code>
<value>Землепользование</value>
</subtype>
</object>
<params>
<category>
<type>
<code>003002000000</code>
<value>Земли населенных пунктов</value>
</type>
</category>
<permitted_use>
<permitted_use_established>
<by_document>Жилой частный сектор</by_document>
</permitted_use_established>
</permitted_use>
<permittes_uses_grad_reg>
<reg_numb_border>52:00-7.1</reg_numb_border>
</permittes_uses_grad_reg>
<area>
<value>438</value>
<inaccuracy>7</inaccuracy>
</area>
</params>
<address_location>
<address_type>
<code>01</code>
<value>Установленный</value>
</address_type>
<address>
<address_fias>
<level_settlement>
<fias>6a7510ae-0e9d-4e74-a36f-57fe370a5149</fias>
<okato>22401382000</okato>
<kladr>52000001000103800</kladr>
<oktmo>22701000001</oktmo>
<postal_code>603040</postal_code>
<region>
<code>52</code>
<value>Нижегородская область</value>
</region>
<city>
<type_city>г</type_city>
<name_city>Нижний Новгород</name_city>
</city>
</level_settlement>
<detailed_level>
<street>
<type_street>пер</type_street>
<name_street>Сочинский</name_street>
</street>
<level1>
<type_level1>уч</type_level1>
<name_level1>1</name_level1>
</level1>
</detailed_level>
</address_fias>
<readable_address>Российская Федерация , Нижегородская обл, городской округ город Нижний Новгород , г Нижний Новгород, пер Сочинский, земельный участок 1</readable_address>
</address>
</address_location>
<cost>
<value>1010106.84</value>
</cost>
</land_record>
</cadastral_block>
</cadastral_blocks>
</extract_cadastral_plan_territory>'''
for path in Path(file_path).rglob('*.XML'):
with open(path, 'r',encoding='utf-8') as parse:
xml = parse.read()
soup = BeautifulSoup(xml, features="xml")
print(soup.select_one('permitted_use_established by_document'))
print(soup.select_one('area value'))
Тут я попробовал структуру файла засунуть в переменную и у меня получилось, но не получается из файла xml. Также попробовал за место "soup = BeautifulSoup(xml, features="xml")" использовал "soup = BeautifulSoup(xml, features="lxml")", тогда выдает "<by_document>Жилой частный сектор</by_document>", но не выдает "438".Есть предположение, что проблема в кодировки xml файла, т.к. когда копирую текст из переменной (который в visual studio code написан) и вставляю в блокнот с сохранением в xml тогда ищет без проблем, но при пересохранении оригинального xml файла через блокнот ни чего не дает. Может быть в этом проблема. Пробовал переустановить python, visual studio code, lxml,bs4, результата нет.
Ответы (2 шт):
Попробуйте так,дописать .text:
with open(file_path, 'r', encoding='utf-8') as file:
xml = file.read()
soup = BeautifulSoup(xml, features="xml")
print(soup.select_one("by_document").text)
print(soup.select_one("area value").text)
Вывод:
Жилой частный сектор
438
Получилось с другой кодировкой
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")
print(soup.select_one('permitted_use_established by_document'))
print(soup.select_one('area value'))