Warm tip: This article is reproduced from serverfault.com, please click

api-Python Zeep WSDL意外元素回溯

(api - Python Zeep WSDL Unexpected Elements Traceback)

发布于 2019-12-24 12:03:15

我在下面无法处理。

XMLParseError: Unexpected element 'metadata', expected 'id' error.

我也尝试strict=False设置,但是zeep的时间没有返回。

from zeep import Client
import zeep
wsdl = 'https://api.n11.com/ws/CategoryService.wsdl'

cl = Client(wsdl=wsdl)
request_data = {"auth":{'appKey' : ***,
'appSecret' : **},'categoryId':int(1003221),"pagingData":{'pageSize':1,'currentPage':0}}
print(cl.service.GetCategoryAttributes(**request_data))

谢谢。

Questioner
tugrulv
Viewed
0
tugrulv 2019-12-30 20:33:41

解决方案:

首先,要检查日志:

import logging.config
logging.config.dictConfig({
    'version': 1,
    'formatters': {
        'verbose': {
            'format': '%(name)s: %(message)s'
        }
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose',
        },
    },
    'loggers': {
        'zeep.transports': {
            'level': 'DEBUG',
            'propagate': True,
            'handlers': ['console'],
        },
    }
})

第二:

from zeep import Client
from zeep.plugins import HistoryPlugin
wsdl = 'https://api.n11.com/ws/CategoryService.wsdl'
from zeep import Client, Settings
settings = Settings(strict=False, xml_huge_tree=True)
history = HistoryPlugin()
from zeep.transports import Transport
transport = Transport(timeout=10)
key={'appKey' : '**',
'appSecret' : '**',
}
cat= {'categoryId':1003221}
dat= {'pageSize':1,'currentPage':1}
client = Client(wsdl=wsdl, transport=transport, plugins=[history], settings=settings)
with client.settings(raw_response=False,strict=False, xml_huge_tree=True):
    response = client.service.GetCategoryAttributes(key,1003221,pagingData=dat)
    #assert response.status_code == 200
    #assert response.content
#node = client.create_message(client.service, 'GetCategoryAttributes',key,1003221,pagingData=dat)
from lxml import etree

try:
    for hist in [history.last_sent, history.last_received]:
        print(etree.tostring(hist["envelope"], encoding="unicode", pretty_print=True))   
except (IndexError, TypeError):
    # catch cases where it fails before being put on the wire
    pass

最后,你可以使用bs4解析xml内容:

from bs4 import BeautifulSoup
soup = BeautifulSoup(ass, 'lxml')
soup.find('category').find('metadata')