如何修复bs4选择错误:“ TypeError:__init __()关键字必须为字符串”

时间:2019-01-06 12:28:47

标签: python xml python-3.x beautifulsoup

我正在编写一个使用发布请求并返回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

1 个答案:

答案 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