2016-04-15 2 views
1

Ищите номера телефонов с нескольких сайтов. Таким образом, каждый сайт более чем вероятно имеет его в разных разделах/классах/форматах и ​​т. Д.Найти номера телефонов

Мне сложно найти номера телефонов с использованием регулярных выражений или классов.

Таким образом, любая помощь приветствуется

мой код

def parse1(self, response): 
hxs = Selector(response) 
titles = hxs.xpath('/html/body') 
items = [] 

for titles in titles: 
    item = GenericCrawlerItem() 

    item["phone"] = re.findall('/^\s*(?:\+?(\d{1,3}))?([-. (]*(\d{3})[-.)]*)?((\d{3})[-. ]*(\d{2,4})(?:[-.x ]*(\d+))?)\s*$/gm', response.body) 

    item["phone"] = titles.xpath('//div[contains(text(), "tel")]/text()').extract() 

    items.append(item) 
    return items 

Спасибо!

редактировать: форматы Я ищу будет в основном стандартный IM подозревавший, такие как:

(xxx)xxx-xxxx 
xxx)xxx-xxxx 
xxx.xxx.xxxx 
xxx xxx xxxx 
x(xxx)xxx-xxxx 
x(xxx)xxx.xxxx 
x.xxx.xxx.xxxx 
+x(xxx)xxx-xxxx 
+x.xxx.xxx.xxxx 

Даже если они не заполнять каждый из них. пара была бы очень полезна!

+0

Вы только сообщаете, что существуют разные форматы. Укажите форматы – rock321987

+0

Спасибо за это! Обновленный вопрос –

+0

Это Python, не нужно '/..../ gm', удалите эти косые черты и' gm'. Попробуйте 'r '(?: \ +? (\ D {1,3}))? ([-. (] * (\ D {3}) [-.)] *)? ((\ D {3}) [-.] * (\ d {2,4}) (?: [-. x] * (\ d +))?) '' –

ответ

0

я нашел достаточно хороший ответ, что результаты, такие как

xxx.xxx.xxxx или ххх-ххх-хххх

Защиту parse1 (я, ответ): HXS = Selector (ответ) названия = hxs.xpath ('/ html/тела') изделия = []

for titles in titles: 
    item = GenericCrawlerItem() 
    item["email"] = re.findall('[\w\.-][email protected][\w\.-]+', response.body) 
    item["website"] = response.url 
    item["links"] = titles.xpath('//a/@href').extract() 
    item["phone"] = re.findall(r'(\d{3}[-.()]\d{3}[-.]\d{4})', response.body) ##results such as xxx xxx-xxxx or xxx.xxxx 

    converter = html2text.HTML2Text() 
    converter.ignore_links = True 
    items.append(item) 
    return items 

Автономные:

item["phone"] = re.findall(r'(\d{3}[-.()]\d{3}[-.]\d{4})', response.body) ##results such as xxx xxx-xxxx or xxx.xxxx 

кричать всем, кто помогал!

0

Регулярное выражение:

(\d\.?|\+\d\.?)?\(?\d{3}(\.| |-|\))\d{3}(\.| |-)\d{4}

... будет соответствовать всем вашим примерам.

Если вы хотите уточнить какую-либо деталь, или если это не сработает для вас, оставьте комментарий, и мы сможем попытаться понять это. Общей причиной этого может быть не то, что что-то не ускользает должным образом (я разработал это регулярное выражение, используя Sublime Text, а не Python - Python может потребовать, чтобы некоторые дополнительные вещи были экранированы здесь и там), или ваш механизм регулярных выражений отличается от моего. Например, не все двигатели регулярных выражений поддерживают метасимвол \d для соответствия номерам 0-9, и не все двигатели поддерживают использование {#} для обозначения определенного количества символов для соответствия.

+0

Спасибо за вашу помощь, к сожалению, получаю такие результаты, как: [('', '-', '-')] –

+0

поэтому после запуска кода я заметил, что он захватывает гораздо эффективнее. Поэтому я думаю, что это комбо вашего регулярного выражения с этим синтаксисом: item ["phone"] = re.findall (r '((\ d {3}) [-.] * (\ D {4})) ', ответ.body) Этот пример синтаксиса, казалось, дал мне лучшие результаты, но я не совсем понял. На самом деле, пытаясь выучить регулярное выражение, набрав это сообщение lol –

+0

Я думаю, что здесь происходит то, что у меня не было никаких ложных срабатываний, чтобы проверить регулярное выражение при его написании. Не могли бы вы привести несколько примеров того, что это ** не должно совпадать **, чтобы можно было еще уточнить? Я проверил регулярное выражение Wiktor Stribiżew на том же наборе данных, что и у меня, и он также отлично поработал. –

Смежные вопросы