XML页面上的HTML解析器,得到d的字典

2024-04-19 22:53:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含以下信息的xml页面:

<currency xmlns:xxsi>
<Observation>
    <Currency_name>U.S. dollar </Currency_name>
    <Observation_ISO4217>USD</Observation_ISO4217>
    <Observation_date>2015-03-09</Observation_date>
    <Observation_data>1.2598</Observation_data>
    <Observation_data_reciprocal>0.7938</Observation_data_reciprocal>
</Observation>
<Observation>
    <Currency_name>U.S. dollar </Currency_name>
    <Observation_ISO4217>USD</Observation_ISO4217>
    <Observation_date>2015-03-11</Observation_date>
    <Observation_data>1.2764</Observation_data>
    <Observation_data_reciprocal>0.7835</Observation_data_reciprocal>
</Observation>
<Observation>
    <Currency_name>Argentine peso</Currency_name>
    <Observation_ISO4217>ARS</Observation_ISO4217>
    <Observation_date>2015-03-09</Observation_date>
    <Observation_data>0.1438</Observation_data>
    <Observation_data_reciprocal>6.9541</Observation_data_reciprocal>
</Observation>
<Observation>
    <Currency_name>Argentine peso</Currency_name>
    <Observation_ISO4217>ARS</Observation_ISO4217>
    <Observation_date>2015-03-10</Observation_date>
    <Observation_data>0.1440</Observation_data>
    <Observation_data_reciprocal>6.9444</Observation_data_reciprocal>
</Observation>
</currency>

我想要一种处理数据的方法,这样我就可以从中得到信息,比如我是想比较同一货币的两个日期,还是比较两个不同国家的货币。我遇到的问题是试图把这些信息输入词典,作为存储信息的好方法。在

我目前正在使用以下代码,但由于同一国家的多个数据,它无法工作。实际页面中每个国家有五(5)个相同的国家(共57个)

^{pr2}$

有人能帮我找到一个好方法来存储多个国家的数据吗?在


Tags: 数据方法name信息datadate页面国家
2条回答

假设您的标记语言中没有嵌套元素,可以从一个简单的解析器开始:

from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.content = []
        self.observation = False
        self.element = None

    def handle_starttag(self, tag, attrs):
        print(tag)
        if tag == 'observation':
            self.content.append({})
            self.observation = True
        elif self.observation:
            self.element = tag
            self.content[-1][self.element] = ""

    def handle_endtag(self, tag):
        if tag == 'observation':
            self.observation = False

        self.element = None

    def handle_data(self, data):
        if self.element:
            self.content[-1][self.element] += data

from pprint import pprint

with open("data.someml", "rt") as infile:
    parser = MyHTMLParser()
    parser.feed(infile.read())

    pprint(parser.content)

给定您的输入文件,这将生成:

^{pr2}$

这里的关键思想是在每次遇到observation开始标记时创建一个新记录(作为字典)。考虑到前面解释的假设,任何其他起始标记都将引入一个数据字段。在

如果您不关心如何解析XML,我建议使用Martin Blech^{}模块。在

由于您的文件缺少一个文档元素,您需要诱使它与以下内容协作:

import xmltodict

with open('input.txt') as f:
    data = f.read()
    d = xmltodict.parse("<root>" + data + "</root>")

d = d['root']

然后您可以使用以下内容访问XML结构:

^{pr2}$

或者,循环所有观察结果:

for obs in d['Observation']:
    print(obs['Currency_name'])
    print(obs['Observation_date'])
    print(obs['Observation_data'])
    print(' -')

输出:

U.S. dollar
2015-03-09
1.2598
 -
U.S. dollar
2015-03-11
1.2764
 -
Argentine peso
2015-03-09
0.1438
 -
Argentine peso
2015-03-10
0.1440
 -

相关问题 更多 >