在Python中,如何引用包含连字符的XML标记

问题描述:

我试图使用BeautifulSoup来解析XML文件。其中一个元素有一个连字符:分配代码在Python中,如何引用包含连字符的XML标记

如何访问它?我试过了:

soup.distribution-code 
soup."distribution-code" (tried single quotes too) 
soup.[distribution-code] 

但这些都没有工作。

+1

您是否尝试过'汤['distribution-code']'? –

+0

我想你真的需要[this](http://www.crummy.com/software/BeautifulSoup/bs4/doc/)。 –

+0

这给了我这个错误:“回溯(最近通话最后一个): 文件‘’,1号线,在 汤[”分配码'] 文件“/usr/lib/python2.7/dist- packages/bs4/element.py“,第834行,在__getitem' – WebUserLearner

可以使用常规的Python语法访问由属性引用非连元素,即obj.name,然而,-是没有使用的语法(Python的把它当作“减”运算符)时一个有效的字符,因此你不能通过该方法访问这些元素。

相反,使用soup.find()soup.find_all()

>>> from bs4 import BeautifulSoup 
>>> soup = BeautifulSoup('<thing><id>1234</id><distribution-code>555444333</distribution-code></thing>') 
>>> soup.thing 
<thing><id>1234</id><distribution-code>555444333</distribution-code></thing> 
>>> soup.id 
<id>1234</id> 
>>> soup.distribution-code 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'code' is not defined 
>>> soup.find('distribution-code') 
<distribution-code>555444333</distribution-code> 

或者,如chepner's comment指出的那样,你可以使用getattr()setattr()获取和设置包含连字符的属性。我认为soup.find()是访问这些元素的更常用的方法。

+0

你可以使用'getattr(汤,'分配代码')'。 – chepner

+0

@chepner:是的,非常好的一点。通过“属性引用”,我的意思是正常的Python语法(_'obj.name'_),而不是通过'getattr()'。我已经更新了我的回答以澄清并包含您的建议。 – mhawke