128 if regex: |
128 if regex: |
129 values = [] |
129 values = [] |
130 for data in re.findall(regex, self.text, re.IGNORECASE): |
130 for data in re.findall(regex, self.text, re.IGNORECASE): |
131 matches = data if isinstance(data, tuple) else [data] |
131 matches = data if isinstance(data, tuple) else [data] |
132 for value in matches: |
132 for value in matches: |
133 value = value.strip() |
133 value = self._preprocess(attr, value) |
134 if value and isinstance(value, basestring) and not value.isdigit() and '_date' in attr: |
|
135 # try casting to date format |
|
136 value = cast_date( |
|
137 value, |
|
138 dayfirst=self.dayfirst, |
|
139 yearfirst=self.yearfirst) |
|
140 if value and value not in values: |
134 if value and value not in values: |
141 # avoid duplicates |
135 # avoid duplicates |
142 values.append(value) |
136 values.append(value) |
143 if values and attr in ('registrar', 'whois_server', 'referral_url'): |
137 if values and attr in ('registrar', 'whois_server', 'referral_url'): |
144 values = values[-1] # ignore junk |
138 values = values[-1] # ignore junk |
147 elif not values: |
141 elif not values: |
148 values = None |
142 values = None |
149 |
143 |
150 self[attr] = values |
144 self[attr] = values |
151 |
145 |
|
146 def _preprocess(self, attr, value): |
|
147 value = value.strip() |
|
148 if value and isinstance(value, basestring) and not value.isdigit() and '_date' in attr: |
|
149 # try casting to date format |
|
150 value = cast_date( |
|
151 value, |
|
152 dayfirst=self.dayfirst, |
|
153 yearfirst=self.yearfirst) |
|
154 return value |
152 |
155 |
153 def __setitem__(self, name, value): |
156 def __setitem__(self, name, value): |
154 super(WhoisEntry, self).__setitem__(name, value) |
157 super(WhoisEntry, self).__setitem__(name, value) |
155 |
158 |
156 |
159 |
256 return WhoisDk(domain, text) |
259 return WhoisDk(domain, text) |
257 elif domain.endswith('.it'): |
260 elif domain.endswith('.it'): |
258 return WhoisIt(domain, text) |
261 return WhoisIt(domain, text) |
259 elif domain.endswith('.ai'): |
262 elif domain.endswith('.ai'): |
260 return WhoisAi(domain, text) |
263 return WhoisAi(domain, text) |
|
264 elif domain.endswith('.il'): |
|
265 return WhoisIl(domain, text) |
261 else: |
266 else: |
262 return WhoisEntry(domain, text) |
267 return WhoisEntry(domain, text) |
263 |
268 |
264 |
269 |
265 class WhoisCom(WhoisEntry): |
270 class WhoisCom(WhoisEntry): |
1237 def __init__(self, domain, text): |
1242 def __init__(self, domain, text): |
1238 if 'not registered' in text: |
1243 if 'not registered' in text: |
1239 raise PywhoisError(text) |
1244 raise PywhoisError(text) |
1240 else: |
1245 else: |
1241 WhoisEntry.__init__(self, domain, text, self.regex) |
1246 WhoisEntry.__init__(self, domain, text, self.regex) |
|
1247 |
|
1248 class WhoisIl(WhoisEntry): |
|
1249 """Whois parser for .il domains |
|
1250 """ |
|
1251 regex = { |
|
1252 'domain_name': 'domain: *(.+)', |
|
1253 'expiration_date': 'validity: *(.+)', |
|
1254 'registrant_name': 'person: *(.+)', |
|
1255 'dnssec': 'DNSSEC: *(.+)', |
|
1256 'status': 'status: *(.+)', |
|
1257 'name_servers': 'nserver: *(.+)', |
|
1258 'emails': 'e-mail: *(.+)', |
|
1259 'phone': 'phone: *(.+)', |
|
1260 'name_servers': 'nserver: *(.+)', |
|
1261 'registrar': 'registrar name: *(.+)', |
|
1262 'referral_url': 'registrar info: *(.+)', |
|
1263 } |
|
1264 |
|
1265 dayfirst = True |
|
1266 |
|
1267 def __init__(self, domain, text): |
|
1268 if 'No data was found' in text: |
|
1269 raise PywhoisError(text) |
|
1270 else: |
|
1271 WhoisEntry.__init__(self, domain, text, self.regex) |
|
1272 |
|
1273 def _preprocess(self, attr, value): |
|
1274 if attr == 'emails': |
|
1275 value = value.replace(' AT ', '@') |
|
1276 return super(WhoisIl, self)._preprocess(attr, value) |