如何使用正则表达式和Python获取XML中特定标签属性的值?

-3 投票
2 回答
4139 浏览
提问于 2025-04-17 17:25

我有一个脚本可以解析一些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)?我现在是用正则表达式和Python来做的。正则表达式的内容是:

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

现在我得到的是'9511',但我需要的是'1417678'。

2 个回答

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

你正在匹配元素名称后面出现的第一个数字序列。第一个数字序列 '(\d+)' 是在任意数量的非数字字符 '[^\d]*' 之后找到的,这里是 9511

为了找到 @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 不是一种规则语言。

撰写回答