如何使用regex + Python从XML获取特定标记属性的值?

时间:2013-02-28 07:36:05

标签: python regex python-2.7 xml-parsing

我有一个解析一些xml的脚本。 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="proxy@9511.org"/><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)?我正在使用regexp + Python。正则表达式字符串:

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

它给我'9511'但我需要'1417678'。

2 个答案:

答案 0 :(得分:5)

您可以使用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="proxy@9511.org"/><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'

答案 1 :(得分:1)

您只是匹配元素名称后面的第一个十进制数字序列。在任意数量的非数字'(\d+)'之后的第一个数字序列'[^\d]*'9511

findall属性的@TEXT值,这样的内容可行:

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不是常规语言。