Как указать значение, если дерево элементов имеет одинаковое имя для одного узла в XML с помощью BeautifulSoup - PullRequest
0 голосов
/ 18 апреля 2019

Я использую BeautifulSoup в Python3.

У меня есть следующий ответ XML API:

<allowed_media_types>
        <media_type>
          <media_type_id>3</media_type_id>
          <media_type_name>Hello World</media_type_name>
          <media_type_category_id>1</media_type_category_id>
          <media_type_category_name>Selfies</media_type_category_name>
        </media_type>
        <media_type>
          <media_type_id>55</media_type_id>
          <media_type_name>Bye World</media_type_name>
          <media_type_category_id>100</media_type_category_id>
       <media_type_category_name>All Types</media_type_category_name>
        </media_type>
      </allowed_media_types>

В настоящее время я использую:

response.find ('media_type') .find (' media_type_id '). строка, которая возвращает только первый узел и значение 3. Я хочу иметь возможность собрать столько узлов, сколько предусмотрено в этом ответе API.

Я пытаюсь выяснить,лучший подход для этого.Конечная цель состоит в том, чтобы собрать все числовые значения и передать другой запрос API в соответствующем параметре.Я заранее благодарен за помощь!

1 Ответ

0 голосов
/ 18 апреля 2019

Вы можете использовать find_all, который вернет список всех найденных элементов, соответствующих этим элементам.Возможно, вы сможете просто напрямую позвонить на soup.find_all('media_type_id'), но я не уверен во всей вашей структуре XML, и если вам нужно убедиться, что она находится под media_type или нет, поэтому мы предполагаем, что вы должны проверить, является ли онапод media_type

from bs4 import BeautifulSoup

xml = """
<allowed_media_types>
  <media_type>
    <media_type_id>3</media_type_id>
    <media_type_name>Hello World</media_type_name>
    <media_type_category_id>1</media_type_category_id>
    <media_type_category_name>Selfies</media_type_category_name>
  </media_type>
  <media_type>
    <media_type_id>55</media_type_id>
    <media_type_name>Bye World</media_type_name>
    <media_type_category_id>100</media_type_category_id>
    <media_type_category_name>All Types</media_type_category_name>
  </media_type>
</allowed_media_types>
"""

soup = BeautifulSoup(xml, 'xml')

print([node.find('media_type_id').text for node in soup.find_all('media_type')])

Вы также можете использовать селекторы и указать тег media_type с прямым потомком (>) media_type_id:

from bs4 import BeautifulSoup

xml = """
<allowed_media_types>
  <media_type>
    <media_type_id>3</media_type_id>
    <media_type_name>Hello World</media_type_name>
    <media_type_category_id>1</media_type_category_id>
    <media_type_category_name>Selfies</media_type_category_name>
  </media_type>
  <media_type>
    <media_type_id>55</media_type_id>
    <media_type_name>Bye World</media_type_name>
    <media_type_category_id>100</media_type_category_id>
    <media_type_category_name>All Types</media_type_category_name>
  </media_type>
</allowed_media_types>
"""

soup = BeautifulSoup(xml, 'xml')

print([node.text for node in soup.select('media_type > media_type_id')])

Вывод:

['3', '55']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...