如何使用regexp + Python从XML中获取指定标记属性的值?

问题描述:

我有一个解析一些XML的脚本。 XML包含:如何使用regexp + Python从XML中获取指定标记属性的值?

<SD TITLE="A" FLAGS="" HOST="9511.com"> 
<TITLE TEXT="9511 domain"/> 
<ADDR STREET="Pmb#400, San Pablo Ave" CITY="Berkeley" STATE="CA" COUNTRY="US"/> 
<CREATED DATE="13-Oct-1990" DAY="13" MONTH="10" YEAR="1990"/> 
<OWNER NAME="9511.Org Domain Name Proxy Agents"/> 
<EMAIL ADDR="[email protected]"/><LANG LEX="en" CODE="us-ascii"/> 
<LINKSIN NUM="75"/><SPEED TEXT="3158" PCT="17"/> 
<CHILD SRATING="0"/> 
</SD> 
<SD> 
<POPULARITY URL="9511.com/" TEXT="1417678" SOURCE="panel"/> 
</SD> 

如何获得 'TEXT' 属性标记的值(在我的情况1417678)?我正在使用正则表达式+ Python。正则表达式字符串:

my_value = re.findall("POPULARITY[^\d]*(\d+)", xml) 

它得到我'9511',但我需要'1417678'。

+0

请使用XML解析器。 Python默认应该有xml模块,如果你不喜欢它,还有其他类似的模块可以安装。 – nhahtdh 2013-02-28 07:42:30

+0

它更容易,谢谢。我只想知道如何修复我的正则表达式。 – 2013-02-28 07:55:49

你只是匹配的元素的名称后出现的小数位数的第一序列。在任意数量的非数字'[^\d]*'之后的第一个数字序列'(\d+)'9511

为了的@TEXT属性findall值,像这样的工作:

my_values = re.findall("<POPULARITY(?:\D+=\"\S*\")*\s+TEXT=\"(\d*)\"", xml) # returning a list btw 

或者,如果没有其他属性将只有数字值除@TEXT

re.findall("<POPULARITY\s+(?:\S+\s+)*\w+=\"(\d+)\"", xml) 

(?:...)匹配拥抱的表达,但不作为可寻址组,如(...)。特殊序列\S\D是它们的小写对应的反转,分别扩展到(除了)空白和数字。

但是,正如已经提到的,正则表达式并不是用于XML,因为XML不是常规语言。

+0

谢谢!此修复程序有效! – 2013-02-28 08:53:55

您可以使用BeautifulSoup

import BeautifulSoup 

xml = '''<SD TITLE="A" FLAGS="" HOST="9511.com"> 
<TITLE TEXT="9511 domain"/> 
<ADDR STREET="Pmb#400, San Pablo Ave" CITY="Berkeley" STATE="CA" COUNTRY="US"/> 
<CREATED DATE="13-Oct-1990" DAY="13" MONTH="10" YEAR="1990"/> 
<OWNER NAME="9511.Org Domain Name Proxy Agents"/> 
<EMAIL ADDR="[email protected]"/><LANG LEX="en" CODE="us-ascii"/> 
<LINKSIN NUM="75"/><SPEED TEXT="3158" PCT="17"/> 
<CHILD SRATING="0"/> 
</SD> 
<SD> 
<POPULARITY URL="9511.com/" TEXT="1417678" SOURCE="panel"/> 
</SD>''' 

soup = BeautifulSoup.BeautifulSoup(xml) 

print(soup.find('popularity')['text']) 

输出

u'1417678'