代码之家  ›  专栏  ›  技术社区  ›  ApacheOne

在带有beautifulsoup的xml中,如果元素树与一个节点同名,则如何将值作为目标

  •  0
  • ApacheOne  · 技术社区  · 6 年前

    我在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').string,它只返回第一个节点和值3。我希望能够收集此api响应提供的尽可能多的节点。

    我正在想办法解决这个问题。最终目标是捕获所有数值并在其各自的参数中传递给另一个api请求。我提前感谢你的帮助!

    0 回复  |  直到 6 年前
        1
  •  0
  •   facelessuser    6 年前

    你可以用 find_all 它将返回它找到的与这些元素匹配的所有元素的列表。你可以直接打电话 soup.find_all('media_type_id') ,但我不确定您的整个XML结构,如果您需要确保它在 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_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']