【问题标题】:XML error object has no attribute 'cssselect'XML 错误对象没有属性“cssselect”
【发布时间】:2013-04-05 10:19:41
【问题描述】:

以下内容似乎无法正确解析 xml 数据或做错了什么。

这是正在运行的代码。

从 lxml 导入 etree 从 lxml.etree 从字符串导入

if request.POST:

    xml = request.POST['xml'].encode('utf-8')
    parser = etree.XMLParser(ns_clean=True, recover=True, encoding='utf-8')
    h = fromstring(xml, parser=parser)
    status = h.cssselect('itagg_delivery_receipt status').text_content()
    return HttpResponse(status)

错误:

AttributeError: 'lxml.etree._Element' 对象没有属性 'cssselect' 状态

这是正在发送的 xml 文档:

 <?xml version="1.1" encoding="ISO-8859-1"?>
<itagg_delivery_receipt>
<version>1.0</version>
<msisdn>447889000000</msisdn>
<submission_ref>
845tgrgsehg394g3hdfhhh56445y7ts6</
submission_ref>
<status>Delivered</status>
<reason>4</reason>
<timestamp>20050709120945</timestamp>
<retry>0</retry>
</itagg_delivery_receipt> 

我已经抛弃了 str(h),它看起来像这样 &lt;element 0x7fd341e93870="" at="" itagg_delivery_receipt=""&gt;&lt;/element&gt;

【问题讨论】:

  • 我认为您不能在 xml 文档上使用 cssselect。如果你从 lxml.html 导入你会得到 cssselect,但我不知道这是否适合你的 XML 文件。

标签: python xml django lxml


【解决方案1】:

以下是使用xpath 获得您想要的东西的方法:

>>> h.xpath('status/text()')
['Delivered']

所以在你的代码中加入一个小辅助函数:

def first(seq,default=None):
  for item in seq:
    return item
  return default

...

status = first(h.xpath('status/text()'))

【讨论】:

    【解决方案2】:

    在使用cssselect之前你需要安装它

    pip install cssselect
    

    【讨论】:

    • OP 正在使用的 lxml 库中有一个 cssselect 模块。
    • @MattH 刚刚从 lxml 重读 csssellect.py 并发现“这是 cssselect 0.7 或更高版本的精简包装器。”
    • @MattH lxml 通过删除其内置的 cssselect 并使用外部 cssselect 增加了另一个障碍(令人惊讶..),这意味着您必须单独安装它
    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 2014-05-14
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    相关资源
    最近更新 更多