簡體   English   中英

Python re.findall掛在某些網站上

[英]Python re.findall hangs on certain websites

我有一個python腳本可以循環瀏覽網站/域列表,以從我的客戶網站中刪除電話和電子郵件,其中99%的網站中沒有問題,並且可以正常工作。 一些網站只是掛起,甚至無法強制中斷操作,就像它處於一個瘋狂的循環中一樣。 下面舉一個例子。 有人可以幫助我改善或解決此問題嗎?

import requests,re

try:   
    r = requests.Session()
    f = r.get('http://www.poffoconsultoria.com.br', verify=False, allow_redirects=False,timeout=(5,5) )
    s = f.text                  
    tels = set(re.findall(r"\s?\(?0?[1-9][1-9]\)?[-\.\s][2-5]\d{3}\.?-?\s?\d{4}",s))
    emails = set(re.findall(r"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}",s))
    print(tels)
    print(emails)
except Exception as e:
    print(e)

您應該刪除\\s? 從第一個正則表達式開始(在比賽開始時您實際上並不需要空格),或者如果只想在空格或字符串開始之后進行匹配,則替換為(?<!\\S)

真正的問題在於第二個正則表達式where . 駐留在用+量化的字符類中。 \\. 其后還匹配一個. 當字符串中沒有匹配的文本時,這將成為一個問題。 這是災難性的回溯

由於您期望的匹配項是整個單詞,因此我建議通過以下方法來增強模式:1)添加單詞邊界,2)使所有相鄰的子模式匹配不同類型的字符。

采用

r'\b[A-Za-z0-9._%+-]+@(?:[A-Za-z0-9-]+\.)+[A-Za-z]{2,4}\b'

匹配電子郵件。

請參閱(?:[A-Za-z0-9-]+\\.)+部分:它匹配一個或多個1個或多個字母數字/連字符的重復,后跟一個點,並且沒有\\. 在此模式之后,有一個alpha字符類,因此應該不會像以前那樣存在問題。

所以。 我在Python27中使用>>> string = requests.get('http://www.poffoconsultoria.com.br').text獲得了很好的網站數據

然后,我取了字符串的長度,然后是>>> len(strings) 474038這確實是一個很高的值。

因此,對於此類問題,當您看到正則表達式需要很長時間(確實是在獲得頁面長度之后)時,您應該在瀏覽器中訪問該頁面並inspect the page source

當我在瀏覽器中檢查頁面時,我發現了以下內容:

在此處輸入圖片說明

在此處輸入圖片說明

第二個正則表達式[A-Za-z0-9._%+-]+肯定會掛起(真的,要花很長時間),因為它無法量化,並且必須搜索那些巨大的部分。

您要么需要分頁頁面,要么限制正則表達式。 或者,如果您懷疑需要返回的內容不會出現在其中,可以編寫一個丟棄字典數據的函數; 但是,基本上,上述那些大詞典使您發布的正則表達式花費很長時間。

使用有效的電子郵件

(?i)(?:("[^"\\]*(?:\\.[^"\\]*)*"@)|((?:[0-9a-z](?:\.(?!\.)|[-!#$%&'*+/=?^`{}|~\w])*)?[0-9a-z]@))(?:(\[(?:\d{1,3}\.){3}\d{1,3}\])|((?:[0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][-a-z0-9]{0,22}[a-z0-9]))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM