当前位置: 首页 > 面试题库 >

将压缩的XML提要解析为ElementTree

范瀚昂
2023-03-14
问题内容

我正在尝试将以下feed解析为python中的ElementTree:“
http://smarkets.s3.amazonaws.com/oddsfeed.xml
”(警告大文件)

到目前为止,这是我尝试过的:

feed = urllib.urlopen("http://smarkets.s3.amazonaws.com/oddsfeed.xml")

# feed is compressed
compressed_data = feed.read()
import StringIO
compressedstream = StringIO.StringIO(compressed_data)
import gzip
gzipper = gzip.GzipFile(fileobj=compressedstream)
data = gzipper.read()

# Parse XML
tree = ET.parse(data)

但是它似乎只是挂在上面compressed_data = feed.read(),也许是无限地??(我知道这是一个大文件,但与我解析的其他非压缩提要相比似乎太长了,而这个大文件首先会扼杀gzip压缩带来的任何带宽增长)。

接下来我尝试requests

url = "http://smarkets.s3.amazonaws.com/oddsfeed.xml"
headers = {'accept-encoding': 'gzip, deflate'}
r = requests.get(url, headers=headers, stream=True)

但现在

tree=ET.parse(r.content)

要么

tree=ET.parse(r.text)

但是这些提出了例外。

正确的方法是什么?


问题答案:

ET.parse函数采用“包含XML数据的文件名或文件对象”。您正在为其提供一个包含XML的字符串。它将尝试打开一个文件,该文件的名称就是XML的很大一部分。可能没有这样的文件。

您需要fromstring函数或XML构造函数。

或者,如果愿意,您已经有了一个文件对象gzipper;您可以将其传递给parse而不是将其读取为字符串。

文档中的简短教程涵盖了所有内容:

我们可以通过读取文件来导入此数据:

import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()

或直接从字符串中:

root = ET.fromstring(country_data_as_string)


 类似资料:
  • 我正在尝试获取XML文件并将其解析到数据库中。XML是用GZIP压缩的。GZIP文件是~8MB。当我在本地运行代码时,pythonw上的内存将被占用。exe的版本升级到整个系统(Windows 7)停止响应的级别,当我在线运行它时,它超过了Google App Engine上的内存限制。不确定文件是否太大或我是否做错了什么。任何帮助都将不胜感激! 使现代化 所以我试着按照BasicWolf的建议切

  • 我正在尝试使用欧洲中央银行(ECB)的当前汇率提要http://www.ECB.int/stats/eurofxref/eurofxref-daily.xml 他们提供了关于如何解析xml的文档,但没有一个选项对我有效:我检查了是否设置了allow_url_fopen=on。 http://www.ecb.int/stats/exchange/eurofxref/html/index.en.htm

  • 解析redis的lzf压缩和解压算法

  • 问题内容: 我有一个XML文件,例如 如何将其解析为JSON结构文件? 问题答案: 对于一个简单的解决方案,我建议使用Jackson库,它是一个Java库,用于生成和读取带有XML扩展名的JSON,因为它只需几行简单的代码就可以将任意复杂的XML转换为JSON。 input.xml Java代码: 该演示使用Jackson 1.7.7 (较新的1.7.8也可以使用),Jackson XML Dat

  • 我有一些信息存储在XML中,我需要解析XML并将一些值存储在Hashmap中。以下是XML: 我想要的关键是:Room1和值:16.412094,48.19719(例如为部分ID=1) 这是第一部分的示例。我有100多个部分,所以我想像我在第一个示例中解释的那样为每个部分存储键和值。 输出为: 房间1: 16.412094,48.19719;房间2: 16.369865,48.199006; 房间

  • tar [-]c|x|u|r|t[z|j][v] -f 归档文件 [待打包文件] 将多个文件打包为一个归档文件,可以在打包的同时进行压缩。支持的格式为 tar(归档)、gz(压缩)、bz2(压缩率更高,比较耗时) 操作选项 -c 创建 -x 解包 -u 更新 -r 添加 -t 查看 -d 比较压缩包内文件和文件 -A 将 tar 文件添加到归档文件中 格式选项 -z 使用 gz 压缩格式 -j 使