【问题标题】:Best way to read/parse XML url in python3在 python3 中读取/解析 XML url 的最佳方法
【发布时间】:2020-03-20 23:42:53
【问题描述】:

我阅读了很多类似问题的不同答案,但似乎没有人提供简单的解决方案。

假设有一个像 https://www.emidius.eu/fdsnws/event/1/query?eventid=quakeml:eu.ahead/event/13270512_0000_000&format=xml 这样的远程 URL,最终目标是获得一个可用的 python 对象(例如字典或类似 json 的对象)。

如果将 xml 保存为本地文件,我确实找到了不同的方法:

import xml.etree.ElementTree as ET

file = '/home/user/query.xml'
tree = ET.parse(file)
root = tree.getroot()

for c in root:
    print(c.tag)
    for i in c:
        print(i.tag)

我没有找到一种方法(使用本机 python 模块)来碰撞一个 url 字符串并获取一个对象。

【问题讨论】:

  • 下载再解析有什么问题?
  • @Joe 因为对于我面临的工作流程,我需要直接使用 url

标签: python json xml parsing


【解决方案1】:

好的,我认为最好的解决方案是这个:

import xml.etree.ElementTree as ET
import urllib.request

opener = urllib.request.build_opener()
url = 'https://www.emidius.eu/fdsnws/event/1/query?eventid=quakeml:eu.ahead/event/13270512_0000_000&includeallorigins=true&includeallmagnitudes=true&format=xml'

tree = ET.parse(opener.open(url))

【讨论】:

    【解决方案2】:

    这可行,但您不需要build_opener()。 您可以为某些特定情况或协议构建自定义开启程序,但您使用普通的 https。所以你可以使用

    import urllib.request
    import xml.etree.ElementTree as ET
    
    url = 'https://www.emidius.eu/fdsnws/event/1/query?eventid=quakeml:eu.ahead/event/13270512_0000_000&includeallorigins=true&includeallmagnitudes=true&format=xml'
    
    with urllib.request.urlopen(url) as response:
       html = ET.fromstring(response.read().decode())
    

    【讨论】:

    • 实际上我得到了一个错误:File name too long 并且html 没有被创建。您需要从 response 中删除 read()
    • 啊,好的。您需要从字符串解析,而不是从open。固定的。字节也必须被解码。
    猜你喜欢
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 2011-05-03
    相关资源
    最近更新 更多