2010-03-27 72 views
1
用正則表達式解析HTML

我的字符串是需要幫助蟒蛇

mystring = "<tr><td><span class='para'><b>Total Amount : </b>INR (Indian Rupees) 
100.00</span></td></tr>" 

我在這裏的問題是我要尋找並獲得總額

test = re.search("(Indian Rupees)(\d{2})(?:\D|$)", mystring) 

,但我的測試給我無。 我怎樣才能獲得的值和值可以是10.00,100.00,1000.00

感謝

回答

7

我強烈建議使用一個真正的HTML解析器對於這一點,而不是一個自定義的正則表達式。

下面是與BeautifulSoup庫的例子:

from BeautifulSoup import BeautifulSoup 

str = r''' 
<tr><td><span class='para'><b>Total Amount : </b>INR (Indian Rupees) 100.00</span></td></tr> 
''' 

soup = BeautifulSoup(str) 

amount = soup.findAll('span', attrs={'class': 'para'}) 
amount_tokens = amount[0].text.split() 
print amount_tokens[-1] 
3

我第二伊萊的反應 - 你會更好使用HTML解析器。

個人而言,我會強烈建議lxml庫解析HTML: http://lxml.de/

這是非常快,功能豐富。

from lxml.html import fromstring 

s = """ 
<tr><td><span class='para'><b>Total Amount : </b>INR (Indian Rupees) 
100.00</span></td></tr> 
""" 

doc = fromstring(s) 
for span in doc.cssselect('span.para'): 
    print span.text_content().split()[-1] 
+0

lxml非常適用於格式良好的HTML; BeautifulSoup非常適用於HTML。 – vy32 2010-03-27 06:12:30

+0

lxml可以很好的處理一個破碎的HTML,除非它是一個完整的「標籤湯」當然是 – 2010-03-27 07:26:54

+1

@ vy32 lxml在許多方面比BS更好,當它不能使用BS的解析時(通過'lxml。 html.soupparser')。如果您想使用HTML5分析規則,它也可以使用html5lib('lxml.html.html5parser')。所以,使用lxml,它給你最多的選擇,實際上是維護等。 – 2010-03-27 09:07:28

1

我同意一個解析器是一個偉大的路要走,但既然你問如何使用正則表達式做到這一點,這裏有一個辦法:

mystring = """<tr><td><span class='para'><b>Total Amount : 
</b>INR (Indian Rupees) 100.00</span></td></tr>""" 

test = re.search("\(Indian Rupees\) ([^<]+)", mystring) 

然後你會得到與號碼:

test.group(1) 
+1

你應該讀http://weblogs.asp.net/alex_papadimoulis/archive/2005/05/25/408925.aspx – 2010-03-27 09:17:25

+1

@Devin請閱讀我的答案的第一行。我同意一個(HTML)解析器是要走的路(它已經被其他人發佈了),但向求助者展示瞭如何修改他的代碼以使其工作方式符合他希望的工作方式。希望提問者至少能學到更多關於正則表達式的知識,這不是一件壞事。不過謝謝你,雖然我覺得你建議的鏈接有點不合適,有點粗魯。我明白了你的觀點,但我希望你也明白我的觀點。 – 2010-03-27 22:12:46

+0

知識並不總是一件好事。如果你只是想教育,還有更好的教導。例如,你可以解釋爲什麼解析器是正確的,而正則表達式是錯誤的。他們不工作!它們很脆弱,根本無法處理HTML的全部功能。相反,你需要制定一個令牌,讓他們知道它們可能不是正確的工具。但是,你並沒有令人信服地支持這一點 - 即使你聲稱這一點,你將其餘的帖子與行動相矛盾:基於正則表達式的解決方案。它發送錯誤的信息並啓用錯誤的選擇。這是錯誤的答案。 – 2010-03-28 03:45:57