如何使用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'。
答
你只是匹配的元素的名称后出现的小数位数的第一序列。在任意数量的非数字'[^\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'
请使用XML解析器。 Python默认应该有xml模块,如果你不喜欢它,还有其他类似的模块可以安装。 – nhahtdh 2013-02-28 07:42:30
它更容易,谢谢。我只想知道如何修复我的正则表达式。 – 2013-02-28 07:55:49