Python使用不常见的标记名解析XML(atom:link)

时间:2017-06-20 17:26:20

标签: python xml

我正在尝试从下面的XML中解析href。有多个workspace标记,下面我只显示一个。

<workspaces>
  <workspace>
    <name>practice</name>
    <atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate" href="https://www.my-geoserver.com/geoserver/rest/workspaces/practice.xml" type="application/xml"/>
  </workspace>
</workspaces>

以上来自使用请求库的requests.get命令:

myUrl = 'https://www.my-geoserver.com/geoserver/rest/workspaces'
headers = {'Accept': 'text/xml'}
resp = requests.get(myUrl,auth=('admin','password'),headers=headers)

如果我搜索'workspace',我会返回对象:

lst = tree.findall('workspace')
print(lst)

结果是:

[<Element 'workspace' at 0x039E70F0>, <Element 'workspace' at 0x039E71B0>, <Element 'workspace' at 0x039E7240>]

好的,但是如何从字符串中获取文本href,我试过了:

lst = tree.findall('atom')
lst = tree.findall('atom:link')
lst = tree.findall('workspace/atom:link')

但是没有一个能够隔离标签,实际上最后一个会产生错误

  

SyntaxError:在前缀映射中找不到前缀'atom'

如何使用这些标记名称获取所有href实例?

2 个答案:

答案 0 :(得分:2)

我发现简单的解决方案:

>>> y=BeautifulSoup(x)
>>> y
<workspaces>
<workspace>
<name>practice</name>
<atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate" href="https://www.my-geoserver.com/geoserver/rest/workspaces/practice.xml" type="application/xml">
</atom:link></workspace>
</workspaces>
>>> c = y.workspaces.workspace.findAll("atom:link")
>>> c
[<atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate" href="https://www.my-geoserver.com/geoserver/rest/workspaces/practice.xml" type="application/xml">
</atom:link>]
>>> 

答案 1 :(得分:0)

对于发现此问题的其他人,冒号前的部分(在本例中为atom)称为命名空间,并在此处引发问题。解决方案非常简单:

myUrl = 'https://www.my-geoserver.com/geoserver/rest/workspaces'
headers = {'Accept': 'text/xml'}
resp = requests.get(myUrl,auth=('admin','my_password'),headers=headers)
stuff = resp.text
to_parse=BeautifulSoup(stuff, "xml")

for item in to_parse.find_all("atom:link"):
    print(item)

感谢Saket Mittal指导我走向BeautifulSoup图书馆。关键是使用xml作为BeautifulSoup函数中的参数。使用lxml只是不能正确解析命名空间并忽略它们。