解决:TypeError: Type ‘list’ cannot be serialized
解决:TypeError: Type ‘list’ cannot be serialized
背景
在使用之前的代码时,报错:
Traceback (most recent call last):
File “E:/Test/test.py”, line 14, in
d = etree.tostring(divs)
File “src/lxml/etree.py”, line 3443, in lxml.etree.tostring
TypeError: Type ‘list’ cannot be serialized.
报错问题
Traceback (most recent call last):
File "E:/Test/test.py", line 14, in <module>
d = etree.tostring(divs)
File "src/lxml/etree.py", line 3443, in lxml.etree.tostring
TypeError: Type 'list' cannot be serialized.
报错翻译
主要报错信息内容翻译如下所示:
Traceback (most recent call last):
File "E:/Test/test.py", line 14, in <module>
d = etree.tostring(divs)
File "src/lxml/etree.py", line 3443, in lxml.etree.tostring
TypeError: Type 'list' cannot be serialized.
翻译:
追溯(最近一次通话):
文件“E:/Test/Test.py”,第14行,在中
d=etree.tosttring(div)
文件“src/lxml/etree.py”,第3443行,在lxml.etree.tostring中
TypeError:无法序列化类型“list”。
报错位置代码
...
divs = html.xpath('//div[@class="rank"]//span[@class="span"]')
d = etree.tostring(divs,encoding='utf-8').encode('utf-8')
...
报错原因
经过查阅资料,发现是html.xpath()
返回值是一个list类型的数据,不能被序列化引起的,然后就会出现这样的提示。
小伙伴们按下面的解决方法即可解决!!!
解决方法
要解决这个错误,需要把list转化为可序列化的值即可,常用的解决办法可以在规则末尾加 /text()
,代码如下。
正确的代码是:
...
html = etree.HTML(content)#HTML网页
divs = html.xpath('//div[@class="rank"]//span[@class="span"]/text()')#XPATH提取数据
print(divs)#输出数据
...
HTML()
函数的官方文档内容如下:
HTML(text, parser=None, base_url=None) Parses an HTML document from a
string constant. Returns the root node (or the result returned by a
parser target). This function can be used to embed “HTML literals”
in Python code.To override the parser with a different HTMLParser you can pass it to
the parser keyword argument.The base_url keyword argument allows to set the original base URL of
the document to support relative Paths when looking up external
entities (DTD, XInclude, …).
翻译如下:
HTML(text, parser=None, base_url=None)
从字符串常量解析HTML文档。返回根节点(或解析器目标返回的结果)。此函数可用于在Python代码中嵌入“HTML文字”。要用一个不同的HTMLParser覆盖解析器,你可以将它传递给parser关键字参数。
base_url关键字参数允许设置文档的原始基本URL,以便在查找外部实体(DTD、XInclude等)时支持相对路径。
xpath()
函数的官方文档内容如下:
xpath(self, _path, namespaces=None, extensions=None,
smart_strings=True, **_variables) XPath evaluate in context of
document.namespaces is an optional dictionary with prefix to namespace URI
mappings, used by XPath. extensions defines additional extension
functions.Returns a list (nodeset), or bool, float or string.
In case of a list result, return Element for element nodes, string for
text and attribute values.Note: if you are going to apply multiple XPath expressions against the
same document, it is more efficient to use XPathEvaluator directly.
翻译如下:
xpath(self, _path, namespaces=None, extensions=None,
smart_strings=True, **_variables) XPath在文档上下文中求值。namespaces是一个可选的字典,带有名称空间URI映射的前缀,用于XPath。Extensions定义了额外的扩展函数。
返回一个列表(节点集),或bool、float或string。
如果是列表结果,则对元素节点返回Element,对文本和属性值返回string。
注意:如果要对同一文档应用多个XPath表达式,那么直接使用XPathEvaluator会更有效。以上翻译结果来自有道神经网络翻译(YNMT)·
通用场景
今天的分享就到此结束了
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!