Python lxml没有在解析int之前将其强制转换为字符串
我试图从python的API调用中提取Qualys漏洞报告ID。本质上,报告ID是一个Python lxml没有在解析int之前将其强制转换为字符串,python,xml,parsing,Python,Xml,Parsing,我试图从python的API调用中提取Qualys漏洞报告ID。本质上,报告ID是一个int,lxml只能解析字符串。我在过去使用了相同的代码来完成这项工作,它工作得很好。我假设lxml足够聪明,可以在解析之前将int强制为string。是否有任何方法可以手动执行此操作,以停止出现解析错误?下面是我的代码、输出和回溯 code: import requests import time import lxml from lxml import etree s = requests.Session
int
,lxml只能解析字符串。我在过去使用了相同的代码来完成这项工作,它工作得很好。我假设lxml
足够聪明,可以在解析之前将int
强制为string
。是否有任何方法可以手动执行此操作,以停止出现解析错误?下面是我的代码、输出和回溯
code:
import requests
import time
import lxml
from lxml import etree
s = requests.Session()
s.headers.update({'X-Requested-With':'X'})
def login(s):
payload = {'action':'login', 'username':'X', 'password':'X'}
r = s.post('https://qualysapi.qualys.com/api/2.0/fo/session/',
data=payload)
def launchReport(s, polling_delay=250):
payload = {'action':'launch', 'template_id':'X',
'output_format':'xml', 'report_title':'X'}
r = s.post('https://qualysapi.qualys.com/api/2.0/fo/report/',
data=payload)
print r.text
extract_id = etree.XML(r).find('.//VALUE')
print("Report ID = %s" % extract_id)
time.sleep(polling_delay)
return extract_id
login(s)
launchReport(s)
输出:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE SIMPLE_RETURN SYSTEM
"https://qualysapi.qualys.com/api/2.0/simple_return.dtd">
<SIMPLE_RETURN>
<RESPONSE>
<DATETIME>2018-02-01T16:00:14Z</DATETIME>
<TEXT>New report launched</TEXT>
<ITEM_LIST>
<ITEM>
<KEY>ID</KEY>
<VALUE>16441920</VALUE>
</ITEM>
</ITEM_LIST>
</RESPONSE>
</SIMPLE_RETURN>
您正在尝试解析响应对象,而不是响应中的数据。将
etree.XML(r)
更改为etree.XML(r.text)
Ahhh,是的,这很有意义。但是,当我这样做时,会出现以下错误:ValueError:不支持带有编码声明的Unicode字符串。请使用字节输入或不带声明的XML片段。
将API调用保存到文件:with open('tmp.XML','w')作为f:f.write(r.text)
然后使用etree.parse('tmp.XML')
@Parfait进行解析。从技术上讲,这不再出错,但我需要返回
标记中的内容。即16441920
。我得到的输出是报告ID=
。如果之前不清楚,请道歉。使用.text属性:etree.parse('tmp.xml')。查找('.//VALUE')。text
Traceback (most recent call last):
File "test.py", line 30, in <module>
launchReport(s)
File "test.py", line 22, in launchReport
extract_id = etree.XML(r).find('.//VALUE')
File "src/lxml/etree.pyx", line 3209, in lxml.etree.XML
(src/lxml/etree.c:80823)
File "src/lxml/parser.pxi", line 1870, in
lxml.etree._parseMemoryDocument (src/lxml/etree.c:121231)
ValueError: can only parse strings