Как использовать Python xml.etree.ElementTree для анализа ответа API eBay? - PullRequest
4 голосов
/ 06 ноября 2010

Я пытаюсь использовать xml.etree.ElementTree для анализа ответов от API поиска eBay, findItemsByProduct.После долгих проб и ошибок я придумал этот код, который печатает некоторые данные:

import urllib
from xml.etree import ElementTree as ET

appID = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
isbn = '3868731342'

namespace = '{http://www.ebay.com/marketplace/search/v1/services}'

url = 'http://svcs.ebay.com/services/search/FindingService/v1?' \
    + 'OPERATION-NAME=findItemsByProduct' \
    + '&SERVICE-VERSION=1.0.0' \
    + '&GLOBAL-ID=EBAY-DE' \
    + '&SECURITY-APPNAME=' + appID \
    + '&RESPONSE-DATA-FORMAT=XML' \
    + '&REST-PAYLOAD' \
    + '&productId.@type=ISBN&productId=' + isbn

root = ET.parse(urllib.urlopen(url)).getroot()

for parts in root:
    if parts.tag == (namespace + 'searchResult'):
        for item in list(parts):
            for a in list(item):
                if a.tag == (namespace + 'itemId'):
                    print 'itemId: ' + a.text
                if a.tag == (namespace + 'title'):
                    print 'title: ' + a.text

Но это выглядит не очень элегантно, как я могу получить 'itemId' и 'title' без зацикливания всех атрибутови проверить, если это тот, который я хочу?Я пытался использовать такие вещи, как .get(namespace + 'itemId') и .find(namespace + 'itemId') и .attrib.get(namespace + 'itemId'), но на самом деле ничего не получалось.

Может кто-нибудь показать мне, как это сделать, используя оболочку Python для этого API?Я видел easyBay , ebay-sdk-python и pyeBay , но мне не удалось заставить кого-либо из них делать то, что я хочу.Есть ли какой-нибудь eBay Python API, который стоит использовать для этого?

1 Ответ

4 голосов
/ 06 ноября 2010

Вы можете использовать ElementTree. Если вы хотите получить элементы, вы можете использовать findall и путь к элементам, а затем выполнить итерацию по списку элементов:

items = root.findall(namespace+'searchResult/'+namespace+'item')
for item in items: 
     item.find(namespace+'itemId').text
     item.find(namespace+'title').text

Чтобы перейти непосредственно к первому itemId из корня:

root.find(namespace+'searchResult/'+namespace+'item/'+namespace+'itemId')

По сути, метод find использует XPath для извлечения элементов более чем на один уровень ниже подэлементов. См. Также объяснение Effbot поддержки XPath в ElementTree

...