【问题标题】:Creating xsd document from file download从文件下载创建 xsd 文档
【发布时间】:2015-08-07 10:17:04
【问题描述】:

我正在尝试加载存储在 s3 上的 xsd 文档。它给了我以下错误

>>> from lxml import etree
>>> xsd_url = 'https://s3-us-west-1.amazonaws.com/premiere-avails/movie.xsd.xml'
>>> node=etree.fromstring(requests.get(xsd_url).text)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "lxml.etree.pyx", line 3092, in lxml.etree.fromstring (src/lxml/lxml.etree.c:70473)
  File "parser.pxi", line 1823, in lxml.etree._parseMemoryDocument (src/lxml/lxml.etree.c:106272)
ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.

我验证了该文件实际上是正确的并且它在本地加载。我将如何从 s3 加载它?

【问题讨论】:

    标签: python amazon-s3 xsd lxml


    【解决方案1】:

    使用.content 类型bytes

    >>> from lxml import etree
    >>> xsd_url = 'https://s3-us-west-1.amazonaws.com/premiere-avails/movie.xsd.xml'
    >>> node = etree.fromstring(requests.get(xsd_url).content))
    

    问题在于您的 xml 文件指定了一种编码,因此 xml 解析器的工作就是解码这种编码。但是您的代码使用了.text,它要求requests 对编码进行解码。

    这样做是正确的,但是 XML 解析器不喜欢得到一个已经解码的东西,然后被告知如何解码它,所以抛出你看到的异常。修复?不要让requests 解码它。

    【讨论】:

      【解决方案2】:

      您可以使用urllib2 并尝试执行以下操作:

          xsd_url = 'https://s3-us-west-1.amazonaws.com/premiere-avails/movie.xsd.xml'
          xsd_contents = urllib2.urlopen(xsd_url).read()
          xmlschema_doc = etree.fromstring(xsd_contents)
      

      【讨论】:

      • “不要使用它” 通常不是“这个库不能正常工作” 的正确答案。更有可能是“检查你是否正确使用它”
      猜你喜欢
      • 1970-01-01
      • 2021-02-16
      • 2011-12-19
      • 2019-10-04
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-21
      相关资源
      最近更新 更多