我正在编写一个使用发布请求并返回XML的脚本。我需要解析该XML才能知道发布请求是否被接受。 我正在使用bs4进行解析,直到大约一周前开始出现错误之前,它都无法正常工作:
dataTable.Columns.Add("Meter", typeof(object));
dataTable.Columns.Add("tank_name", typeof(object));
dataTable.Columns.Add("OpeningBalance", typeof(object));
dataTable.Columns.Add("IN", typeof(object));
dataTable.Columns.Add("OUT", typeof(object));
dataTable.Columns.Add("ClosingBalance", typeof(object));
dataTable.Columns.Add("StartTemperature", typeof(object));
dataTable.Columns.Add("EndTemperature", typeof(object));
我正在同一文件的其他部分中使用bs4的select函数,但没有收到此错误,而且我无法在线找到任何有关它的信息。 起初我以为是版本问题,但我同时尝试了python3.7和3.6,并遇到了相同的错误。
这是用于产生错误的代码:
TypeError: __init__() keywords must be strings
完整错误消息:
res = requests.post(url, data = body, headers = headers)
logging.debug('Res HTTP status is {}'.format(res.status_code))
try:
res.raise_for_status()
resSoup = BeautifulSoup(res.text, 'xml')
# get the resultcode from the resultcode tag
resCode = resSoup.select_one('ResultCode').text
当我检查res.text类型时,得到了预期的'str'类。
登录Traceback (most recent call last):
File "EbarInt.py", line 292, in <module>
resCode = resSoup.select_one('ResultCode').text
File "C:\Program Files (x86)\Python36-32\lib\site-packages\bs4\element.py", line 1345, in select_one
value = self.select(selector, namespaces, 1, **kwargs)
File "C:\Program Files (x86)\Python36-32\lib\site-packages\bs4\element.py", line 1377, in select
return soupsieve.select(selector, self, namespaces, limit, **kwargs)
File "C:\Program Files (x86)\Python36-32\lib\site-packages\soupsieve\__init__.py", line 108, in select
return compile(select, namespaces, flags).select(tag, limit)
File "C:\Program Files (x86)\Python36-32\lib\site-packages\soupsieve\__init__.py", line 50, in compile
namespaces = ct.Namespaces(**(namespaces))
TypeError: __init__() keywords must be strings
后,我得到:
res.text
答案 0 :(得分:3)
更新:BeautifulSoup 4.7.1已发布,修复了默认命名空间问题。请参见release notes。您可能只想针对性能修复进行升级。
原始答案:
您必须已升级到BeautifulSoup 4.7,该版本用soupsieve
project代替了简单而有限的内部CSS解析器,这是一个更为完善的CSS实现。
该项目存在一个问题,即默认名称空间附加到响应中的元素之一:
<CreateOrUpdateTaskResponse xmlns="Trackem.Web.Services">
用于构建BeautifulSoup对象树的XML解析器将其正确地传达为命名空间字典中的None
-> 'Trackem.Web.Services'
映射,但是soupsieve
代码要求所有命名空间都具有一个前缀名称(xmlns:prefix
)的默认名称空间标有空字符串,而不是None
,导致此错误。我将其报告为issue #68 to the soupsieve
project。
这里您根本不需要使用select_one
,除了元素名称之外,您没有使用任何CSS语法。请改用soup.find()
:
resCode = resSoup.find('ResultCode').text