【问题标题】:Capture parent node id when unique values found in combination在组合中找到唯一值时捕获父节点 ID
【发布时间】:2021-02-23 02:37:03
【问题描述】:

我正在寻找解析这个 API 响应,:

<export_response xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://cakemarketing.com/api/4/">
  <success>true</success>
  <row_count>3</row_count>
    <fruits>
        <fruit>
            <fruit_id>178</fruit_id>
            <filters>
                <filter>
                <filter_id>231</filter_id>
                <filter_type>
                <filter_type_id>70</filter_type_id>
                </filter_type>
                <param_number xsi:nil="true"/>
                <param_string>CA|NY|AZ</param_string>
                <param_date xsi:nil="true"/>
                <param_bool xsi:nil="true"/>
                </filter>
                <filter>
                <filter_id>237</filter_id>
                <filter_type>
                <filter_type_id>90</filter_type_id>
                </filter_type>
                <param_number xsi:nil="true"/>
                <param_string>Poor < 5</param_string>
                <param_date xsi:nil="true"/>
                <param_bool xsi:nil="true"/>
                </filter>
            </filters>
        </fruit>
         <fruit>
            <fruit_id>178</fruit_id>
            <filters>
                <filter>
                <filter_id>231</filter_id>
                <filter_type>
                <filter_type_id>70</filter_type_id>
                </filter_type>
                <param_number xsi:nil="true"/>
                <param_string>CA|NY|AZ</param_string>
                <param_date xsi:nil="true"/>
                <param_bool xsi:nil="true"/>
                </filter>
                <filter>
                <filter_id>237</filter_id>
                <filter_type>
                <filter_type_id>90</filter_type_id>
                </filter_type>
                <param_number xsi:nil="true"/>
                <param_string>Poor < 5</param_string>
                <param_date xsi:nil="true"/>
                <param_bool xsi:nil="true"/>
                </filter>
            </filters>
        </fruit>
            <fruit>
            <fruit_id>178</fruit_id>
            <filters>
                <filter>
                <filter_id>231</filter_id>
                <filter_type>
                <filter_type_id>70</filter_type_id>
                </filter_type>
                <param_number xsi:nil="true"/>
                <param_string>CA|NY|AZ</param_string>
                <param_date xsi:nil="true"/>
                <param_bool xsi:nil="true"/>
                </filter>
                <filter>
                <filter_id>237</filter_id>
                <filter_type>
                <filter_type_id>90</filter_type_id>
                </filter_type>
                <param_number xsi:nil="true"/>
                <param_string xsi:nil="true"/> 
                <param_date xsi:nil="true"/>
                <param_bool xsi:nil="true"/>
                </filter>
            </filters>
        </fruit>
    </fruits>
</export_response>

目标是当 内部等于 'Poor

我尝试过使用 findall() 和 .find(text='CA|NY|AZ Poor

欢迎任何建议,在此先感谢您。

【问题讨论】:

    标签: python-3.x xml api beautifulsoup


    【解决方案1】:

    在 bs4 4.7.1+ 中,您可以使用 :has 和 :contains 的组合,以及使用相邻的兄弟组合符 (+) 来指定请求模式。通过使用 AND 语法连接两个搜索词的模式,您只选择两者都存在的地方。我假设你想要唯一的 ID,所以使用了一个集合

    from bs4 import BeautifulSoup as bs
    xml = '''your xml goes here'''
    soup = bs(xml, 'lxml')
    unique_ids = {i.text for i in soup.select('fruit_id:has(+ filters param_string:contains("Poor < 5")):has(+ filters param_string:contains("CA|NY|AZ"))')}
    print(unique_ids)
    

    【讨论】:

      【解决方案2】:

      您实际上并没有 176,但这里有一种方法可以捕获要列出的 id 和参数,然后您可以测试列表元素并根据需要对其进行操作。

      # data = your xml from above
      
      soup = BeautifulSoup(data, "lxml")
      for f in soup.find_all('fruit'):
          test_list = []
          test_list.append(f.fruit_id.text)
          for ps in f.find_all('filter'):
              test_list.append(ps.find('param_string').text)
          print(test_list)
          # do your validations here.....after each iteration
      

      产生:

      ['178', 'CA|NY|AZ', 'Poor < 5']
      ['178', 'CA|NY|AZ', 'Poor < 5']
      ['178', 'CA|NY|AZ', '']
      

      【讨论】:

        猜你喜欢
        • 2022-09-23
        • 1970-01-01
        • 2021-07-16
        • 1970-01-01
        • 2017-05-29
        • 2021-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多