Найти данные по определенному условию в xml

Рейтинг: 0Ответов: 2Опубликовано: 29.03.2023

Имеется XML в таком виде:

<old_numbers>
  <old_number>
    <number_type>
      <code>99</code>
      <value>Иной номер</value>
    </number_type>
    <number>408529001</number>
  </old_number>
  <old_number>
    <number_type>
      <code>01</code>
      <value>Инвентарный номер</value>
    </number_type>
    <number>10406</number>
  </old_number>
  <old_number>
    <number_type>
      <code>03</code>
      <value>Кадастровый номер</value>
    </number_type>
    <number>52-52-01/773/2008-203</number>
  </old_number>
  <old_number>
    <number_type>
      <code>02</code>
      <value>Условный номер</value>
    </number_type>
    <number>52-52-01/773/2008-203</number>
  </old_number>
</old_numbers>

Помогите пожалуйста найти только "10406", это "Инвентарный номер", по условию поска "code - 01".


Мой код:

def number_type():
    number_type = soup.find_all('number_type')
    for f in number_type:
        code = f.select('code')
        for j in code:
            if j.text == '01':
                return j

def old_number(old_number):
    for value in old_number:
        if number_type():
            number_d = value.find_all('number')
            print(number_d)
number = old_number(soup.find_all('old_number'))

Ответы

▲ 0Принят
from bs4 import BeautifulSoup

xml = '''<old_numbers>
  <old_number>
    <number_type>
      <code>99</code>
      <value>Иной номер</value>
    </number_type>
    <number>408529001</number>
  </old_number>
  <old_number>
    <number_type>
      <code>01</code>
      <value>Инвентарный номер</value>
    </number_type>
    <number>10406</number>
  </old_number>
  <old_number>
    <number_type>
      <code>03</code>
      <value>Кадастровый номер</value>
    </number_type>
    <number>52-52-01/773/2008-203</number>
  </old_number>
  <old_number>
    <number_type>
      <code>02</code>
      <value>Условный номер</value>
    </number_type>
    <number>52-52-01/773/2008-203</number>
  </old_number>
</old_numbers>'''

soup = BeautifulSoup(xml, "lxml")

# 1
number_type = soup.find_all('old_number')
for x in number_type:
    if x.find("code").text == '01':
        print(x.find('value').text, x.find('number').text)

# 2
for x in number_type:
    code, value, number = x.stripped_strings
    if code == '01':
        print(value, number)
▲ 1
from bs4 import BeautifulSoup as Soup

xml_content = """<old_numbers>
  <old_number>
    <number_type>
      <code>99</code>
      <value>Иной номер</value>
    </number_type>
    <number>408529001</number>
  </old_number>
  <old_number>
    <number_type>
      <code>01</code>
      <value>Инвентарный номер</value>
    </number_type>
    <number>10406</number>
  </old_number>
  <old_number>
    <number_type>
      <code>03</code>
      <value>Кадастровый номер</value>
    </number_type>
    <number>52-52-01/773/2008-203</number>
  </old_number>
  <old_number>
    <number_type>
      <code>02</code>
      <value>Условный номер</value>
    </number_type>
    <number>52-52-01/773/2008-203</number>
  </old_number>
</old_numbers>"""

soup = Soup(xml_content, 'lxml')

soup.find('code', text='01').find_next('number').get_text()