我有一个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)
。你知道吗真正的问题是第二个regex,其中
.
驻留在用+
量化的字符类中。它后面的\.
也与.
匹配,因此当字符串中没有匹配的文本出现时,它就成了一个问题。这是catastrophic backtracking。你知道吗因为您期望的匹配是整词,所以我建议通过1)添加词边界,2)使所有相邻的子模式匹配不同类型的字符来增强模式。你知道吗
使用
匹配电子邮件。你知道吗
参见
(?:[A-Za-z0-9-]+\.)+
部分:它匹配1个或多个字母数字/连字符的一个或多个重复,后跟一个点,并且没有\.
在这个模式之后,有一个字母字符类,因此应该没有像前面出现的问题。你知道吗使用有效电子邮件
所以。我在Python27中使用
>>> string = requests.get('http://www.poffoconsultoria.com.br').text
很好地获得了网站数据然后我计算了字符串的长度,它是
>>> len(strings) 474038
,这是一个非常高的值。你知道吗因此,对于这样的问题,当您看到regex花费了很长时间(实际上,在获得页面长度之后),您应该在浏览器中访问页面并
inspect the page source
当我在浏览器中查看页面时,我发现:
第二个regex
[A-Za-z0-9._%+-]+
肯定会挂起(真的,需要很长时间),因为它是不可量化的,必须搜索那些巨大的部分。你知道吗您要么需要将页面分块,要么限制regex。或者,如果您怀疑需要返回的内容不会出现在字典中,您可以编写一个丢弃字典数据的函数;但基本上,上面那些庞大的字典会导致您发布的regex花费很长时间。你知道吗
相关问题 更多 >
编程相关推荐