【问题标题】:Python - Request GZ file and Parsing XMLPython - 请求 GZ 文件并解析 XML
【发布时间】:2020-03-06 15:22:38
【问题描述】:

几天前我开始学习 Python,以建立一个基本站点,以便从 BOINC 项目(例如 SETI@home 等)中编译一些统计数据。

网站基本上是这样的:

  • 下载gz文件
  • 将gz文件解压成xml文件
  • 将 xml 信息构建到数据结构中
  • 将数据结构写回到 cvs 文件中

总共有来自 34 个不同 BOINC 项目的 34 个 .gz 文件。

现在所有代码都已完成并且可以运行,但是来自一个项目的 .gz 文件拒绝解析,而其他 34 个可以正常工作。

文件是:

user.gz

来自

http://www.rnaworld.de/rnaworld/stats/

这些是我得到的错误:

Traceback (most recent call last):
  File "C:/Users/chris/PycharmProjects/testproject1/rnaw100.py", line 77, in <module>
    for event, elem in ET.iterparse(str(x_file_name2), events=("start", "end")):
  File "C:\Users\chris\AppData\Local\Programs\Python\Python38-32\lib\xml\etree\ElementTree.py", line 1227, in iterator
    yield from pullparser.read_events()
  File "C:\Users\chris\AppData\Local\Programs\Python\Python38-32\lib\xml\etree\ElementTree.py", line 1302, in read_events
    raise event
  File "C:\Users\chris\AppData\Local\Programs\Python\Python38-32\lib\xml\etree\ElementTree.py", line 1274, in feed
    self._parser.feed(data)
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 1, column 0

这是下载 .gz 文件并解析 XML 的代码:(我省略了 var 声明等)

作为一个新手,我发现很难理解哪里出了问题,因为 (a) 错误指的是 Python 核心文件,例如 ElementTree.py,并且 (b) 我不明白为什么 .gz 文件有很多其他 BOINC 统计网站正在使用不会在这里工作,以及 (c) 为什么我的代码适用于 34 个文件,但不是这个 1。

response = requests.get(url2, stream=True)

if response.status_code == 200:
    with open(target_path2, 'wb') as f:
        f.write(response.raw.read())

with gzip.open(target_path2, 'rb') as f_in:
    with open(x_file_name2, 'wb') as f_out:
        shutil.copyfileobj(f_in, f_out)

for event, elem in ET.iterparse(str(x_file_name2), events=("start", "end")):

    if elem.tag == "total_credit" and event == "end":
        tc=float(elem.text)
        elem.clear

    if elem.tag == "expavg_credit" and event == "end":
        ac=float(elem.text)
        elem.clear

    if elem.tag == "id" and event == "end":
        id=elem.text
        elem.clear

    if elem.tag == "cpid" and event == "end":
        cpid=elem.text
        elem.clear

    if elem.tag == "name" and event == "end":
        name = elem.text
        elem.clear()
    teamid=TEAMID

    if elem.tag == "teamid" and event == "end":
        if elem.text == TEAMID:
            cnt=cnt+1
            dic[id]={"Name":name,"CPID":cpid, "TC":tc, "AC":ac}
        elem.clear()

【问题讨论】:

  • 打开解压后的文件,查看数据是否为XML格式。
  • 如果我使用 7zip 并解压 .gz 文件。然后将解压后的 XML 文件打开到 Pycharm 中并重新保存。然后我的代码读起来没问题。

标签: python request xml-parsing celementtree boinc


【解决方案1】:

另一种解决方案。

from simplified_scrapy import SimplifiedDoc,req,utils
import gzip
with gzip.open('user.gz', 'rb') as f_in:
  with open('user.xml', 'wb') as f_out:
    f_out.write(f_in.read())
html = utils.getFileContent('user.xml')
doc = SimplifiedDoc(html)
users = doc.selects('user')
for user in users:
  tags = user.children

@Chris 我解压缩文件并保存它。数据是正确的。尝试用它替换您的shutil。

import gzip
with gzip.open('user.gz', 'rb') as f_in:
    with open('user.xml', 'wb') as f_out:
        f_out.write(f_in.read())

【讨论】:

  • 我用你的代码替换了我的代码,但我得到了完全相同的错误。
  • @Chris 它在这里工作,或者您可以尝试其他解决方案。
  • 我已经尝试过更改shutil,但没有任何区别。我的代码适用于其他 33 个 xml gz 文件。最后,我通过使用 RPC http 生成 xml 文件解决了这个问题。使用相同的代码可以正常工作。例如 ElementTree iterparse。但是感谢您的代码建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2018-11-09
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多