我知道这个问题已经被问过多次了。我花了几个小时寻找不同的答案,但没有一个对我有用。 我正在从soap调用中检索xml输出。我需要能够解析它并获取重要的元素。 但是,无论我尝试什么,我都会不断收到“文件名太长”错误。
截至目前,我的代码位于:
import requests
import requests
import xml.etree.ElementTree as ET
from bs4 import BeautifulSoup
from lxml import html
def sendRequest():
url= " ?? "
headers= {
"SOAPAction": "??",
"Content-Type": "text/plain; charset=utf-8",
}
body="""<?xml version=\"1.0\" encoding=\"utf-8\"?>
<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"
xmlns:urn=\"###\" xmlns:v1=\"###\" xmlns:v11=\"###\" xmlns:v12=\"http://###\">
<soapenv:Header>
<urn:MessageHeader version=\"1.0\">
<MessageID>test</MessageID>
<CreateDateTime>2013-07-05T10:56:19.701+05:30</CreateDateTime>
<From app=\"test\" module=\"test\" nodeID=\"test\" systemCode=\"test\"/>
</urn:MessageHeader>
</soapenv:Header>
<soapenv:Body>
<v1:SearchInput>
<v11:Style>
<v11:StyleAttributes StyleIdentifier=\"NUM\"/>
</v11:Style>
<v11:AdvanceFilter WantChildren=\"1\" WantRelationship=\"1\"/>
<v11:ExtendedFilterInput WantCP=\"1\"/>
</v1:SearchInput>
</soapenv:Body>
</soapenv:Envelope>
"""
### = information masked
response = requests.post(url, data=body, headers=headers)
data = response.text
with open('output.xml', 'w') as f:
f.write(data)
tree = ET.parse(data)
root = tree.getroot()
print(root)
send_request()
我尝试了BeautifulSoup,lxml,首先将xml保存到文件中,然后直接从调用中读取它。我使用了ET.parse()以及ET.fromstring()。尝试使用响应本身以及响应的内容。我在其他地方看到的所有答案。我确定其中一种组合可以使用,但我只是没有弄清楚哪一种组合;) 我真的不知道如何解决这个问题。 任何帮助表示赞赏。
错误:
Traceback (most recent call last):
File "mdm.py", line 61, in <module>
send_request()
File "mdm.py", line 43, in send_request
tree = ET.parse(data)
File "/Users/mm/opt/anaconda3/lib/python3.7/xml/etree/ElementTree.py", line 1197, in parse
tree.parse(source, parser)
File "/Users/mm/opt/anaconda3/lib/python3.7/xml/etree/ElementTree.py", line 587, in parse
source = open(source, "rb")
OSError: [Errno 63] File name too long: '<?xml version="1.0" encoding="UTF-8"?> .....