2013-02-28 113 views
-3

我有一個解析一些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

回答

1

你只是匹配的元素的名稱後出現的小數位數的第一序列。在任意數量的非數字'[^\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

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="[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' 
相關問題