Проблема спарсить из 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 шт):

Автор решения: gfd2

Попробуйте так,дописать .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'))
→ Ссылка