2016-04-15 31 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 

感謝です!

編集:彼らはそれらの一つ一つに記入されていない場合でも

(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'を削除します。 (\ d {3})[*]?)((\ d {3})) [ - 。] *(\ d {2,4})(?:[ - 。x] *(\ d +))?) '' –

答えて

0

私はそのような

xxx.xxx.xxxx または XXX-XXX-XXXXのようになり

に答えるデフparse1(自己、応答)は十分に良いが見つかりました: HXS =セレクタ(レスポンス) タイトル= 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 

助けてくれた皆様にshoutout!

0

正規表現:

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

は...あなたの例のすべてに一致します。

どの部分であれ明確にしたい場合や、それがうまくいかない場合は、コメントを残しておいてください。これがうまくいかない理由は、何かが適切にエスケープされていないためです(PythonではなくSublime Textを使ってこの正規表現を開発しました - Pythonではいくつかの追加のものをここでエスケープする必要があるかもしれません)。たとえば、すべての正規表現エンジンが数字0-9と一致するように\dメタ文字をサポートしているわけではなく、特定の文字数を表すためにすべてのエンジンが{#}の使用をサポートしているわけではありません。

+0

あなたの助けてくれてありがとうございました。 [( ''、 ' - '、 ' - ')] –

+0

あなたのコードを実行した後、私はそれをもっと効果的につかむことに気付きました。だから、あなたの正規表現とこの構文のコンボです: item ["phone"] = re.findall(r '((\ d {3})[ - 。] *(\ d {4})) '、レスポンス。body) この構文例は私に最良の結果を与えるように見えましたが、私は完全に理解していません。実際にこれを入力している間、正規表現を学習しようとしています –

+0

私はここで何が起こっていると思いますが、正規表現を書くときに正規表現をテストするための誤検出はありませんでした。あなたは、それがさらに洗練されるように**合ってはならないもののいくつかの例を教えてください。私はWiktorStribiżewの正規表現を、私が開発した同じデータセットでテストしました。彼はまた素晴らしい仕事をしました。 –