Python关于芬德尔挂在某些网站上

2024-04-23 23:56:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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)

Tags: re脚本false列表客户网站requests电话
3条回答

您应该从第一个正则表达式中删除\s?(您不需要在匹配的开始处使用空格),或者如果您只想在空格或字符串的开始处进行匹配,则替换为(?<!\S)。你知道吗

真正的问题是第二个regex,其中.驻留在用+量化的字符类中。它后面的\.也与.匹配,因此当字符串中没有匹配的文本出现时,它就成了一个问题。这是catastrophic backtracking。你知道吗

因为您期望的匹配是整词,所以我建议通过1)添加词边界,2)使所有相邻的子模式匹配不同类型的字符来增强模式。你知道吗

使用

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

匹配电子邮件。你知道吗

参见(?:[A-Za-z0-9-]+\.)+部分:它匹配1个或多个字母数字/连字符的一个或多个重复,后跟一个点,并且没有\.在这个模式之后,有一个字母字符类,因此应该没有像前面出现的问题。你知道吗

使用有效电子邮件

(?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]))

所以。我在Python27中使用>>> string = requests.get('http://www.poffoconsultoria.com.br').text很好地获得了网站数据

然后我计算了字符串的长度,它是>>> len(strings) 474038,这是一个非常高的值。你知道吗

因此,对于这样的问题,当您看到regex花费了很长时间(实际上,在获得页面长度之后),您应该在浏览器中访问页面并inspect the page source

当我在浏览器中查看页面时,我发现:

enter image description here

enter image description here

第二个regex [A-Za-z0-9._%+-]+肯定会挂起(真的,需要很长时间),因为它是不可量化的,必须搜索那些巨大的部分。你知道吗

您要么需要将页面分块,要么限制regex。或者,如果您怀疑需要返回的内容不会出现在字典中,您可以编写一个丢弃字典数据的函数;但基本上,上面那些庞大的字典会导致您发布的regex花费很长时间。你知道吗

相关问题 更多 >