【问题标题】:How to get value of specified tag attribute from XML using regexp + Python?如何使用 regex + Python 从 XML 中获取特定标签属性的值?
【发布时间】:2013-02-14 07:35:36
【问题描述】:

我有一个解析一些 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”。

【问题讨论】:

  • 请使用 XML 解析器。 Python默认应该有xml模块,如果不喜欢可以安装其他类似的模块。
  • 它更容易,谢谢。我只想知道如何修复我的正则表达式。

标签: python regex python-2.7 xml-parsing


【解决方案1】:

您可以使用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'

【讨论】:

    【解决方案2】:

    您只是匹配出现在元素名称之后的第一个十进制数字序列。在任意数量的非数字'[^\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 不是常规语言。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      相关资源
      最近更新 更多