2016-10-03 5 views
-1

私は美しいスープを扱っていて、私のウェブスクレイパーで私が選んだ深みまでメールを取りたいと思っています。現在のところ、私のウェブスクレイピングツールが動作していない理由はわかりません。私はそれを実行するたびに、それは電子メールのリストに値を設定しません。美味しいスープに電子メールを取り込む方法は?

#!/usr/bin/python 
from bs4 import BeautifulSoup, SoupStrainer 
import re 
import urllib 
import threading 

def step2(): 
    file = open('output.html', 'w+') 
    file.close() 
    # links already added 
    visited = set() 
    visited_emails = set() 
    scrape_page(visited, visited_emails, 'https://www.google.com', 2) 

    print('Webpages \n') 
    for w in visited: 
     print(w) 

    print('Emails \n') 
    for e in visited_emails: 
     print(e) 

# Run recursively 
def scrape_page(visited, visited_emails, url, depth): 

    if depth == 0: 
    return 

    website = urllib.urlopen(url) 
    soup = BeautifulSoup(website, parseOnlyThese=SoupStrainer('a', email=False)) 

    emails = re.findall(r"[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}", str(website)) 

    first = str(website).split('mailto:') 
    for i in range(1, len(first)): 
     print(first.split('>')[0]) 

    for email in emails: 
     if email not in visited_emails: 
      print('- got email ' + email) 
      visited_emails.add(email) 


    for link in soup: 
     if link.has_attr('href'): 
      if link['href'] not in visited: 
       if link['href'].startswith('https://www.google.com'): 
        visited.add(link['href']) 
        scrape_page(visited, visited_emails, link['href'], depth - 1) 

def main(): 
    step2() 

main() 

何らかの理由で私のコードを修正してメールをリストに追加する方法が不明です。もしあなたが私に助言を与えることができれば、それは大いに感謝されるでしょう。あなただけのmailtoでHREFさんを探すために必要なおかげ

+1

'str(ウェブサイト)'を表示してチェックしてください - テキストにメールがないかもしれません - あなたはボットが好きではないgoogleをスクラップしています: – furas

+1

なぜ正規表現を使用していますか? –

+0

@furas googleは単なるテスト例でした。ウェブサイトのいくつかの理由なしのために、私は、それはそれほどあなたが言っていた電子メール –

答えて

1

:何のmailtoのGoogleページにこすりするためには存在しないよう

emails = [a["href"] for a in soup.select('a[href^=mailto:]')] 

私はhttps://www.google.comを推定あなたはスクレーピングしている実際のサイトのプレースホルダです。ソースにmailtoがある場合、あなたはそれを見つけるでしょう。

+0

のフォーマットに従っている場合見つけるためにするために正規表現を使用してみましたdidntの仕事 – alecxe

+0

うーん、私のためにいずれかの作業をしているようです。送信されていないメールに何か間違いがありますか? –

+1

@alecxe、f(n)がO(g(n))であることを見てから2時間後≡C∃k∀n(n> k→f(n)≤Cg(n)) 'I何か少し精神的に課税する必要があります;) –

関連する問題