2013-01-07 20 views
-1

我用下面的代碼,找到下載頁面上的電子郵件地址:如何在頁面上找到電子郵件?

page = urlfetch.Fetch(url = 'http://www.toyotabc.ru/vacancy/', deadline = 60) 
if page.status_code == 200 and page.content: 
    regexp = re.compile(
     r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*" 
     r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-011\013\014\016-\177])*"' 
     r')@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}$', re.IGNORECASE) 
    email = regexp.findall(page.content) 
    if email: 
     email = email[0] 
     self.response.out.write('e-mail found: %s<br>' % (email)) 

但它沒有返回值(emailFalse),當在代碼中給出的示例頁面上存在的電子郵件。 我的代碼有什麼問題?

+1

表達式'r'\ w + @ \ w + \。\ w {2,6}''似乎適用於我 - 這是否適合您的情況? – RocketDonkey

+0

@RocketDonkey,是的,它的工作原理。但它不會捕獲帶有點的電子郵件 - [示例](http://pythonre.appspot.com/?pattern=\w%2B%40\w%2B\.\w {2%2C6}&string = test.email%40example.com&功能=&的findall標誌= IGNORECASE)。 –

+0

@LA_:修改RocketDonkey的表達式以使用正確的字符而不是'\ w'很簡單。比調試你正在開始的一大堆正則表達式要容易得多。你從哪裏得到這些信息,以及爲什麼所有那些有控制字符的東西? – abarnert

回答

3

我不知道爲什麼你已經開始使用充滿控制字符和其他東西的表達式,甚至是表達式應該表達的意思。也許如果你告訴我們你在哪裏得到它,或者解釋它,我們可以幫你調試它。但除此之外,把它扔掉並給你一個更簡單的就簡單多了。

你說你從this answer那裏得到它,但是那個答案中的字符串比你給出的長29個字符,所以顯然你複製粘貼錯了,或者以某種方式修改了它。無論如何,根據這個問題,該正則表達式旨在驗證域名的電子郵件地址,而不是查找所有電子郵件地址。它似乎也處理引用(甚至可能編碼?)名稱。它以^開頭並以$結尾的事實清楚地表明,它不能用於在字符串中間查找地址,而只能匹配整個字符串。所以,這不是你想要的。你不能只從一個問題中提取正則表達式,並希望它適用於與模糊相關的問題,而不理解它在做什麼。

您抱怨說RocketDonkey不適用於包含點的電子郵件。這是真的,它也不處理地址中有效的其他幾個字符。您可以閱讀相應的RFC,但在網上快速搜索電子郵件地址的預製正則表達式要快得多。

您可能希望看到this question,其中包含完全符合RFC-822的正則表達式的鏈接,並解釋如何在需要時獲取符合RFC-5322標準的正則表達式。

但是,根據您的使用情況,您可能希望更簡單一些,可以調整它以匹配無效但工作地址,或者不匹配有效但無用的地址,或者匹配原生Unicode而不是IDN。錯位的Unicode,或...

這裏是第一個我在谷歌搜索發現:

regexp=re.compile(r'[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,6}', re.IGNORECASE) 

它是正確的嗎?一目瞭然,它看起來應該處理所有且僅有的使用DNS名稱的有效電子郵件地址,但這不是所有有效的地址。也許你需要處理虛線IP郵件域,或者互聯網之前的電子郵件地址,或者你想在某些方面變得更寬鬆,或者更加嚴格,或者其他方面。如果是這樣,你必須解釋你想要的是什麼。但是你應該可以自己從這裏開始:在你的測試用例上試試看看。如果不正確,閱讀起來非常簡單,應該很容易修改。

+0

我已經從這個答案採取了正則表達式 - http://stackoverflow.com/a/2640791/604388,我已經看到這是從Django的源代碼。 –

+1

@LA_:是的,根據您鏈接的答案,它取自Django源代碼。但它不是用於從HTML頁面提取所有地址,它用於驗證針對特定域的單個地址。這不是你想要做的,所以這不會有什麼好處。即使你確實複製了它,並刪除了'^'和'$'。 – abarnert

相關問題