python: 下载和缓存 XML 文件 - 如何处理编码声明?
python: Dowloading and caching XML files - how to handle encoding declaration?
from urllib.request import urlopen
from lxml import objectify
我正在尝试编写一个程序,它将 XML 文件下载到缓存中,然后使用 objectify
打开它们。如果我使用 urlopen()
下载文件,那么我可以使用 objectify.fromstring()
阅读它们:
r = urlopen(my_url)
o = objectify.fromstring(r.read())
但是,如果我下载它们并将它们写入文件,我最终会在文件顶部得到一个 objectify
不喜欢的编码声明。即:
# download the file
my_file = 'foo.xml'
r = urlopen(my_url)
# save locally
with open(my_file, 'wb') as fp:
fp.write(r.read())
# open saved copy
with open(my_file, 'r') as fp:
o1 = objectify.fromstring(fp.read())
结果 ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.
如果我使用 objectify.parse(fp)
那么效果很好——我可以修改所有客户端代码以使用 parse()
,但我觉得这不是正确的方法.我在本地存储了其他 XML 文件,.fromstring()
可以正常工作——根据粗略的审查,它们似乎具有 utf-8
编码。
我只是不知道这里的正确分辨率是多少 - 我应该在保存文件时更改编码吗?我应该去掉编码声明吗?我应该用 try.. except ValueError
子句填充我的代码吗?请指教
文件需要以二进制模式而不是文本模式打开。
open(my_file, 'rb') # b stands for binary
如异常所示:... Please use bytes input ...
from urllib.request import urlopen
from lxml import objectify
我正在尝试编写一个程序,它将 XML 文件下载到缓存中,然后使用 objectify
打开它们。如果我使用 urlopen()
下载文件,那么我可以使用 objectify.fromstring()
阅读它们:
r = urlopen(my_url)
o = objectify.fromstring(r.read())
但是,如果我下载它们并将它们写入文件,我最终会在文件顶部得到一个 objectify
不喜欢的编码声明。即:
# download the file
my_file = 'foo.xml'
r = urlopen(my_url)
# save locally
with open(my_file, 'wb') as fp:
fp.write(r.read())
# open saved copy
with open(my_file, 'r') as fp:
o1 = objectify.fromstring(fp.read())
结果 ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.
如果我使用 objectify.parse(fp)
那么效果很好——我可以修改所有客户端代码以使用 parse()
,但我觉得这不是正确的方法.我在本地存储了其他 XML 文件,.fromstring()
可以正常工作——根据粗略的审查,它们似乎具有 utf-8
编码。
我只是不知道这里的正确分辨率是多少 - 我应该在保存文件时更改编码吗?我应该去掉编码声明吗?我应该用 try.. except ValueError
子句填充我的代码吗?请指教
文件需要以二进制模式而不是文本模式打开。
open(my_file, 'rb') # b stands for binary
如异常所示:... Please use bytes input ...