我是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.
感谢您的帮助!
答案 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>