Python lxml没有在解析int之前将其强制转换为字符串

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

我试图从python的API调用中提取Qualys漏洞报告ID。本质上,报告ID是一个
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