2017-03-24 15 views
1

私は非常にプログラミングに新しいので、私の質問があまりにも些細な場合appologise。 私は最近「Intro to Computer Science」、「Pythonプログラミング基礎」などいくつかのUdacityコースを受講しました。このコードを改善するにはどうしたらいいですか?

私の上司は、特定のウェブサイトからいくつかのメールアドレスを収集するように私に依頼しました。その中には同じページに複数のアドレスがあるものがあるので、ベルが鳴ったので、自分のコードを作成して電子メールを収集し、スプレッドシートに貼り付けるという繰り返し作業を行うことを考えていました。

だから、これらのコルのレッスンとyoutubeのいくつかのビデオを見直した後、私はこのコードを思いついた。

注:Python 2.7.12で書かれており、私はUbuntu 16.04を使用しています。

import xlwt 
from bs4 import BeautifulSoup 
import urllib2 

def emails_page2excel(url): 
    # Create html file from a given url 
    sauce = urllib2.urlopen(url).read() 
    soup = BeautifulSoup(sauce,'lxml') 

    # Create the spreadsheet book and a page in it 
    wb = xlwt.Workbook() 
    sheet1 = wb.add_sheet('Contacts') 

    # Find the emails and write them in the spreadsheet table 
    count = 0 
    for url in soup.find_all('a'): 
    link = url.get('href') 
    if link.find('mailto')!=-1: 
     start_email = link.find('mailto')+len('mailto:') 
     email = link[start_email:] 
     sheet1.write(count,0,email) 
     count += 1 

    wb.save('This is an example.xls') 

コードはうまく動作し、非常に高速です。しかし、私はこれらの方法でそれを改善したいと思います:

  • は私がforループよりエレガント の方法で行うことができる感覚を得ました。文字列検索以外の電子メールを探す方法はありますか?同様の方法で、が見つかりました 'a'タグ?
  • 私はこのコードをURL文字列で評価するのではなく、ウェブサイトのリスト(スプレッドシートの可能性が高い)で評価したいと考えています。私はまだこれを行う方法について研究する時間がありませんでしたが、どんな提案も歓迎です。
  • 最後に、の親しみやすいミニプログラムのようなものでこのスクリプトを実装する方法があるかどうかを質問したいと思います。例えば、私の上司はコンピュータで全く悪いです。私は彼女がターミナルシェルを開いてPythonコードを実行するとは想像もしません。代わりに、私は彼女がメールを抽出したいウェブサイトを持つスプレッドシートをアップロードしたり、メールやその他の情報を抽出したいのかどうか、さらにいくつかの機能を選択するかどうかを選択するプログラムを作成したいボタンをクリックして結果を取得します。

私は自分自身をはっきりと表現したいと思います。事前に おかげで、

Anqin

+0

http://codereview.stackexchange.com/ – Stedy

答えて

0

限りBeautifulSoupの3つの方法でaで電子メールを検索することができますが行くように:

1)aをしていると持っているすべてのタグを検索するlambdafind_allを使用します属性としてhrefがあり、その値はmailtoです。

for email in soup.find_all(lambda tag: tag.name == "a" and "href" in tag.attrs and "mailto:" in tag.attrs["href"]): 
print (email["href"][7:]) 

2)aタグにmailto:を見つけることregexfind_allを使用してください。

for email in soup.find_all("a", href=re.compile("mailto:")): 
    print (email["href"][7:]) 

3)そのhref属性がmailto:を開始するにaタグを検索しselectを使用してください。

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

これは私の個人的な好みですが、私はurllibrequestsを使用して好みます。より簡単で、エラー処理に優れ、スレッド化するときに安全です。

その他の質問については、必要な結果を取得、解析、返すメソッドを作成し、urlをパラメータとして渡すことができます。あなたは、あなたのURLのリストをループし、そのメソッドを呼び出すだけでよいでしょう。

あなたの上司の質問には、GUIを使用してください。

楽しいコーディングがあります。

+0

の方が良いと思われるので、この質問を議論の対象外としています。Zroqに感謝します。あなたの提案をすべて理解するまでには時間がかかりました。しかし、私はたくさんのことを学んでいます、ありがとう! – Anqin

関連する問題