2016-04-15 26 views
1

Suchen nach Telefonnummern von mehreren Standorten. Also jede Seite hat es mehr als wahrscheinlich in verschiedenen Abschnitten/Klassen/Formate etc.Suchen nach Telefonnummern

Ich habe eine harte Zeit, Telefonnummern mit Regex oder Klassen zu finden.

So jede mögliche Hilfe

meinen Code geschätzt wird, ist

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 

Dank!

edit: die Formate i gesucht bin hauptsächlich Standard im Verdacht stehen, wie:

(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 

Auch wenn sie nicht sind, jeder von ihnen ausfüllen. ein Paar wäre super hilfreich!

+0

Sie sagen nur, dass es verschiedene Formate gibt..specify die Formate – rock321987

+0

Danke für den Kopf! Aktualisierte Frage –

+0

Es ist Python, keine Notwendigkeit für '/..../ gm', entferne diese Schrägstriche und' gm'. Versuchen Sie 'r '(?: \ +? (\ D {1,3}))? ([-. (] * (\ D {3}) [-.)] *)? ((\ D {3}) [-.] * (\ d {2,4}) (?: [-. x] * (\ d +))?) " –

Antwort

0

fand ich gut genug beantworten wie

xxx.xxx.xxxx oder xxx-xxx-xxxx

def Parse1 (self, Reaktion) ergibt: hxs = Selector (Antwort) Titel = hxs.xpath ('/ html/body') Artikel = []

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 

Stand alone: ​​

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

shoutout an alle, die geholfen haben!

0

Die Regex:

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

... werden alle Ihre Beispiele entsprechen.

Wenn Sie eine Klärung wünschen, oder wenn es für Sie nicht funktioniert, hinterlassen Sie einen Kommentar und wir können versuchen, es herauszufinden. Ein häufiger Grund, warum dies nicht funktionieren könnte, ist, dass etwas nicht richtig maskiert wird (ich habe diesen Regex mit Sublime Text entwickelt, nicht Python - Python erfordert möglicherweise einige zusätzliche Dinge hier und da zu entkommen), oder Ihre Regex-Engine unterscheidet sich von meiner. Zum Beispiel unterstützen nicht alle Regex-Engines das \d Metazeichen, um die Zahlen 0-9 zu finden, und nicht alle Engines unterstützen die Verwendung von {#}, um eine bestimmte Anzahl von Zeichen zu bezeichnen, die übereinstimmen.

+0

Danke für Ihre Hilfe, leider bekomme ich Ergebnisse wie: [('', '-', '-')] –

+0

also nach dem Ausführen Ihres Codes bemerkte ich, dass es viel effektiver ergreift. Also ich denke, es ist eine Kombination Ihrer Regex mit dieser Syntax: item ["Telefon"] = re.findall (r '((\ d {3}) [-.] * (\ D {4})) ', Antwort.Körper) dieses Syntaxbeispiel schien mir die besten Ergebnisse zu geben, aber ich verstehe nicht vollständig. Eigentlich versuche ich Regex zu lernen, während ich das hier schreibe. Lol –

+0

Ich denke, was hier passiert ist, dass ich keine falschen positiven Ergebnisse hatte, um die Regex beim Schreiben zu testen. Könntest du einige Beispiele für Dinge nennen, die ** nicht übereinstimmen sollten, damit sie weiter verfeinert werden können? Ich habe die Regex von Wiktor Stribiżew auf dem gleichen Datensatz getestet, den ich von mir entwickelt habe, und er hat auch großartig funktioniert. –