如何从API中获取特定数据并将其导出而不将数据写入文件?

时间:2018-01-08 21:04:37

标签: python xml api python-requests

我是Python的新手,并且使用API​​并希望得到一些帮助!

使用网址:http://api.worldbank.org/v2/countries?format=xml 我想收集每个国家" iso2Code"和"名称"。 我希望能够以更干净的XML文件格式或数组输出数据(但是会喜欢有关如何做到这两者的知识!)。

我现在可以将它写入文件并在那里使用它,但我试图在没有额外步骤的情况下对其进行排序。

我到目前为止还没有多少,但现在是:

import requests

url = ("http://api.worldbank.org/v2/countries?format=xml")

r = requests.get(url)

with open(('testcase.xml'), 'w') as f:
        f.write(r.text)

test = r.text
print(test)

This is the data I receive upon printing. I want to gather the first two parts.

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您可以使用正则表达式(re)在XML中查找带有findall的字符串,然后将结果保存到pandas数据帧中。

像这样:

o.Extras("UserDefinedFieldName1") = "foo"

答案 1 :(得分:0)

考虑XSLT,这是一种专用语言,旨在将XML从复杂类型转换为更简单的类型,以满足您的特定需求,例如仅提取 iso2Code 名称

Python的lxml模块可以运行XSLT 1.0脚本。但是,因为XSLT是可移植的,所以您不需要lxml,但可以调用其他程序,如Linux / Mac的专用XSLT处理器:xsltproc

<强> XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                              xmlns:wb="http://www.worldbank.org"
                              exclude-result-prefixes="wb">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/wb:countries">
     <countries>
       <xsl:apply-templates select="wb:country"/>
     </countries>
    </xsl:template>

    <xsl:template match="wb:country">
     <country>
       <iso2Code><xsl:value-of select="wb:iso2Code"/></iso2Code>
       <name><xsl:value-of select="wb:name"/></name>
     </country>
    </xsl:template>

</xsl:stylesheet>

Python (使用lxml)

import lxml.etree as et

# LOAD XML AND XSL
doc = et.parse('http://api.worldbank.org/v2/countries?format=xml')
xsl = et.parse('XSLT_Script.xsl')

# TRANSFORM SOURCE
transformer = et.XSLT(xsl)
result = transformer(doc)

# PRINT TO SCREEN
print(result)

# SAVE TO FILE
with open('Output.xml', 'wb') as f:
  f.write(result)

Python (对Unix&x; xsltproc的命令行调用)

import requests as rq
from subprocess import Popen

url = "http://api.worldbank.org/v2/countries?format=xml"
r = rq.get(url)

with open('Input.xml', 'wb') as f:
    f.write(r.content)              # NOTICE .text NOT USED

proc = Popen(['xsltproc -o Output.xml XSLT_Script.xsl Input.xml'], 
             shell=True, cwd='/path/to/working/directory',
             stdin=None, stdout=None, stderr=None)

<强>输出

<?xml version="1.0"?>
<countries>
  <country>
    <iso2Code>AW</iso2Code>
    <name>Aruba</name>
  </country>
  <country>
    <iso2Code>AF</iso2Code>
    <name>Afghanistan</name>
  </country>
  <country>
    <iso2Code>A9</iso2Code>
    <name>Africa</name>
  </country>
  <country>
    <iso2Code>AO</iso2Code>
    <name>Angola</name>
  </country>
  <country>
    <iso2Code>AL</iso2Code>
    <name>Albania</name>
  </country>
  <country>
    <iso2Code>AD</iso2Code>
    <name>Andorra</name>
  </country>
...
</countries>