2012-09-24 162 views
14

有沒有一個標準功能來檢查IRI,來檢查URL顯然,我可以使用:Python:如何檢查一個字符串是否是一個有效的IRI?

parts = urlparse.urlsplit(url) 
    if not parts.scheme or not parts.netloc: 
     '''apparently not an url''' 

我嘗試了上面的URL包含Unicode字符:

import urlparse 
url = "http://fdasdf.fdsfîășîs.fss/ăîăî" 
parts = urlparse.urlsplit(url) 
if not parts.scheme or not parts.netloc: 
    print "not an url" 
else: 
    print "yes an url" 

和我所得到的是yes an url。這是否意味着我對這個有效的IRI測試很好?有另一種方法嗎?

+0

爲什麼你不應該是好?您的示例是否違反IRI標準定義的任何規則?換句話說:你問我們你的測試是否違反了IRI規則?你自己做了這個研究嗎? –

+0

@ Jan-PhilipGehrcke如果我對此感到滿意,我會問一位比IRI有更多經驗的人。 –

回答

19

使用urlparse不足以測試一個有效的IRI。

使用rfc3987 package代替:

from rfc3987 import parse 

parse('http://fdasdf.fdsfîășîs.fss/ăîăî', rule='IRI') 
+3

'ImportError:No module named rfc3987' so it is not standard,'pip install rfc3987' –

+1

您必須安裝他鏈接到 –

+0

的軟件包@DavidRobinson'pip install rfc3987'也可以工作 –

1

the implementation of urlparse中唯一的字符集敏感代碼要求該方案僅包含ASCII字母,數字和[+ - 。]字符;否則它是完全不可知的,所以可以很好地處理非ASCII字符。

由於這是non-documented behaviour,您有責任檢查它是否仍然如此(在您的項目中進行測試),但我不認爲它會改變爲打破IRI。

的urllib提供quoting functions虹膜轉換到/從ASCII的URI,但他們仍然不提虹膜文件明確,他們在某些情況下破壞:Is there a unicode-ready substitute I can use for urllib.quote and urllib.unquote in Python 2.6.5?

+0

'urllib.quote(url)'似乎可以逃避'http://'到'http%3A //' –

+1

@EduardFlorinescu的':'冒號,默認情況下它只能用於引用IRI;對於完整的IRI,您需要解析,引用和重新組裝這些組件。 – ecatmur

相關問題