Как разделить ответ XML API между Dict и List - PullRequest
0 голосов
/ 20 апреля 2019

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

<?xml version="1.0" encoding="utf-8"?>
<export_response xmlns:xsd="" xmlns:xsi="" xmlns="">
  <success>true</success>
  <row_count>2</row_count>
  <offers>
    <offer>
      <offer_id>336</offer_id>
      <offer_name>Home Page Flagship Product</offer_name>
      <advertiser>
        <advertiser_id xmlns="API:id_name_store">61</advertiser_id>
        <advertiser_name xmlns="API:id_name_store">bradvertiser</advertiser_name>
      </advertiser>
      <vertical>
        <vertical_id xmlns="API:id_name_store">87</vertical_id>
        <vertical_name xmlns="API:id_name_store">DTC Ecom</vertical_name>
      </vertical>
      <offer_type>
        <offer_type_id xmlns="API:id_name_store">3</offer_type_id>
        <offer_type_name xmlns="API:id_name_store">3rd Party</offer_type_name>
      </offer_type>
      <offer_status>
        <offer_status_id xmlns="API:id_name_store">1</offer_status_id>
        <offer_status_name xmlns="API:id_name_store">Public</offer_status_name>
      </offer_status>
      <hidden>false</hidden>
    </offer>
    <offer>
      <offer_id>337</offer_id>
      <offer_name>Complimentary Product</offer_name>
      <advertiser>
        <advertiser_id xmlns="API:id_name_store">61</advertiser_id>
        <advertiser_name xmlns="API:id_name_store">bradvertiser</advertiser_name>
      </advertiser>
      <vertical>
        <vertical_id xmlns="API:id_name_store">87</vertical_id>
        <vertical_name xmlns="API:id_name_store">DTC Ecom</vertical_name>
      </vertical>
      <offer_type>
        <offer_type_id xmlns="API:id_name_store">3</offer_type_id>
        <offer_type_name xmlns="API:id_name_store">3rd Party</offer_type_name>
      </offer_type>
      <offer_status>
        <offer_status_id xmlns="API:id_name_store">1</offer_status_id>
        <offer_status_name xmlns="API:id_name_store">Public</offer_status_name>
      </offer_status>
      <hidden>false</hidden>
    </offer>
  </offers>
<export_response>

Вот мой блок кода:

import requests
import json
import csv
from bs4 import BeautifulSoup



addOfferValues = []
    for data in csv_reader:
        url = ""
        params = {"api_key":"",
                "offer_name":"",
                "offer_id":data['Offer ID'],
                "advertiser_id":data['Advertiser ID'],
                "vertical_id":data['Vertical ID'],
                "offer_type_id":"0",
                "media_type_id":"0",
                "tag_id":"0",
                "start_at_row":"0",
                "row_limit":"0",
                "sort_field":"offer_name",
                "sort_descending":"TRUE",
                "offer_status_id":"0"}

        req = requests.get(url, params=params)
        response = BeautifulSoup(req.text, 'lxml')

        hidden = response.find('hidden').string
        hidden = 'on' if hidden == 'true' else 'off'

        addOfferParams = {"api_key":"",
                    "offer_id":"0",
                    "advertiser_id":response.find('advertiser_id').string,
                    "vertical_id":response.find('vertical_id').string,
                    "offer_name":response.find('offer_name').string,
                    "third_party_name":"",
                    "hidden":hidden,
                    "offer_status_id":response.find('offer_status_id').string,
                    "offer_type_id":response.find('offer_type_id').string}
        addOfferValues.append(addOfferParams)
        addOfferReq = requests.get('https://cs1', params=addOfferParams)

Моя цель - захватить первое предложение:

<offer>
      <offer_id>336</offer_id>
      <offer_name>Home Page Flagship Product</offer_name>
      <advertiser>
        <advertiser_id xmlns="API:id_name_store">61</advertiser_id>
        <advertiser_name xmlns="API:id_name_store">bradvertiser</advertiser_name>
      </advertiser>
      <vertical>
        <vertical_id xmlns="API:id_name_store">87</vertical_id>
        <vertical_name xmlns="API:id_name_store">DTC Ecom</vertical_name>
      </vertical>
      <offer_type>
        <offer_type_id xmlns="API:id_name_store">3</offer_type_id>
        <offer_type_name xmlns="API:id_name_store">3rd Party</offer_type_name>
      </offer_type>
      <offer_status>
        <offer_status_id xmlns="API:id_name_store">1</offer_status_id>
        <offer_status_name xmlns="API:id_name_store">Public</offer_status_name>
      </offer_status>
      <hidden>false</hidden>
    </offer>

и сохраните в моем addOfferParams Dict, который я успешно выполнил. Если row_count больше 1, я хочу, чтобы данные второго предложения или любые дополнительные предложения были сохранены в моем списке addOfferValues. Затем я сделаю второй запрос с этими точками данных. Я был бы признателен за любой совет здесь, поскольку столкнулся с контрольно-пропускным пунктом новичка. Заранее спасибо!

1 Ответ

1 голос
/ 20 апреля 2019

Я читаю из файла, но он показывает принцип зацикливания на всех строках предложения и добавления в окончательный список.Я использую soup для ссылки на объект soup, а не response, так как нахожу это менее запутанным.

Затем вы можете зациклить окончательный список, делая ваши запросы.

from bs4 import BeautifulSoup

addOfferValues = []

with open(r'C:\Users\User\Desktop\test.xml', encoding="utf8") as f:
    contents = f.read()
    soup = BeautifulSoup(contents, "lxml")

    hidden = soup.find('hidden').string
    hidden = 'on' if hidden == 'true' else 'off' # assuming this is correct and as wanted 

    for offer in soup.select('offer'):
        addOfferParams = {"api_key":"",
                        "offer_id": offer.select_one('offer_id').text, # I had added. Did you wish to exclude?
                        "advertiser_id": offer.select_one('advertiser_id').text,
                        "vertical_id": offer.select_one('vertical_id').text,
                        "offer_name": offer.select_one('offer_name').text,
                        "third_party_name":"",
                        "hidden":hidden,
                        "offer_status_id": offer.select_one('offer_status_id').text,   # I had added. Did you wish to exclude?
                        "offer_type_id":  offer.select_one('offer_type_id').text} 
        addOfferValues.append(addOfferParams)

print(addOfferValues)

#loop final list making requests with params

Вывод:

enter image description here

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