2009-11-08 203 views
2

是否有做以下更簡潔/正確的/ Python的方式:Python化的方式找到一個正則表達式匹配

url = "http://0.0.0.0:3000/authenticate/login" 
re_token = re.compile("<[^>]*authenticity_token[^>]*value=\"([^\"]*)") 
for line in urllib2.urlopen(url): 
    if re_token.match(line): 
     token = re_token.findall(line)[0] 
     break 

我想從一個HTML名爲「authenticity_token」的輸入標籤的價值頁面:

<input name="authenticity_token" type="hidden" value="WTumSWohmrxcoiDtgpPRcxUMh/D9m7O7T6HOhWH+Yw4=" /> 
+2

正確的做法是使用BeautifulSoup這樣的HTML解析器:http://www.crummy.com/software/BeautifulSoup/。看到這裏的原因:http://stackoverflow.com/questions/701166/can-you-provide-some-examples-of-why-it-is-hard-to-parse-xml-and-html-with- a-rege – 2009-11-08 23:10:09

+2

正則表達式不應該與html/XML一起使用 - 有太多方法可能導致事情中斷。看看BeautiflSoup或其中一個html解析器模塊。 – 2009-11-08 23:11:13

+0

您需要使用像BeautifulSoup這樣的解析器。如果你使用正則表達式,並且惡意用戶想辦法將一些與正則表達式匹配的文本放在頁面某處,例如,在評論或什麼?你最終以爲這是真正的問題,這是在尋求麻煩。 – 2009-11-09 00:31:16

回答

6

您能用這個嗎?Beautiful Soup?代碼基本上看起來像這樣:

from BeautifulSoup import BeautifulSoup 
url = "hhttp://0.0.0.0:3000/authenticate/login" 
page = urlli2b.urlopen(page) 
soup = BeautifulSoup(page) 
token = soup.find("input", { 'name': 'authenticity_token'}) 

這樣的東西應該工作。我沒有測試這個,但你可以用read the documentation來得到它。

1

你不需要findall調用。相反使用:

m = re_token.match(line) 
if m: 
    token = m.group(1) 
    .... 

我第二推薦BeautifulSoup超過正則表達式雖然。

1

使用正則表達式沒有什麼「pythonic」。如果你不希望使用BeautifulSoup(你應該理想情況下),只需使用Python的出色的字符串處理功能

for line in open("file"): 
    line=line.strip() 
    if "<input name" in line and "value=" in line: 
     item=line.split() 
     for i in item: 
      if "value" in i: 
       print i 

輸出

$ more file 
<input name="authenticity_token" type="hidden" value="WTumSWohmrxcoiDtgpPRcxUMh/D9m7O7T6HOhWH+Yw4=" /> 
$ python script.py 
value="WTumSWohmrxcoiDtgpPRcxUMh/D9m7O7T6HOhWH+Yw4=" 
+0

這段代碼太糟糕了...比原來的恕我直言還糟糕(儘管當然像BS這樣的實際解析器是要走的路)。你幾乎不應該有這樣的四元嵌套語句。原來有兩個,你加倍了。 – 2009-11-09 01:56:22

+0

Andyou介紹了一堆隨機字符串文字。 – 2009-11-09 01:57:13

+0

你應該看看我的輸出,然後再發表評論。我只是在一個只有OP樣本行的文件上做這件事,僅僅是爲了說明你可以使用Python的內部字符串功能而沒有太多的正則表達式。你在說什麼四元嵌套語句和隨機字符串文字?如果您有更好的解決方案,請將其發佈出去。 – ghostdog74 2009-11-09 02:37:55

0

至於爲什麼你不應該使用正則表達式搜索HTML,主要有兩個原因。

第一個是遞歸定義HTML,並且編譯成無堆棧狀態機的正則表達式不執行遞歸。你不能寫一個正則表達式,當它遇到一個結束標籤時,它可以告訴它在它到達它所屬標籤的路上遇到了什麼開始標籤;沒有地方可以保存這些信息。

第二個是解析HTML(BeautifulSoup的做法)規範化HTML中允許的所有事情,而且你可能不會考慮在你的正則表達式中。要挑一個簡單的例子,你想要什麼解析:

<input name="authenticity_token" type="hidden" value="xxx"/> 

可以很容易爲:

<input name='authenticity_token' type="hidden" value="xxx"/> 

<input type = "hidden" value = "xxx" name = 'authenticity_token' /> 

或一百個其他的排列中的任何一個我現在沒有想到。