首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Zeep WSDL意外元素回溯

Python Zeep WSDL意外元素回溯
EN

Stack Overflow用户
提问于 2019-12-24 20:03:15
回答 2查看 897关注 0票数 1

我不能在下面处理这个问题。

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

我也尝试了strict=False设置,但当时zeep返回为none。

代码语言:javascript
复制
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))

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-30 20:33:42

解决方案:

首先,查看日志:

代码语言:javascript
复制
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'],
        },
    }
})

第二:

代码语言:javascript
复制
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内容:

代码语言:javascript
复制
from bs4 import BeautifulSoup
soup = BeautifulSoup(ass, 'lxml')
soup.find('category').find('metadata')
票数 1
EN

Stack Overflow用户

发布于 2020-12-15 02:04:07

我用同样的API遇到了同样的问题。我的解决方案是改变zeep的设置。您应该使用xsd_ignore_sequence_order=True。我希望现在还来得及。

代码语言:javascript
复制
settings = Settings(strict=False, xml_huge_tree=True, xsd_ignore_sequence_order=True)

阅读更多:https://docs.python-zeep.org/en/master/settings.html#module-zeep.settings

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59468568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档