-2
root@bt:~# ./phemail.py -g0@*******.com
Gathering emails from domain: ******.com
Traceback (most recent call last):
  File "./phemail.py", line 206, in <module>
  gatherEmails(domain[0],domain[1],p)
  File "./phemail.py", line 51, in gatherEmails
  namesurname = re.sub(' -.*','',a.text.encode('utf8'))
AttributeError: 'NoneType' object has no attribute 'encode'

a.text が NoneType 型であるのはなぜですか?

4

3 に答える 3

0

a.text値がありません ( None)変数
を初期化する行に問題がある可能性がありaます。

ちなみに、ルートとして物事を行うことはお勧めしません。

于 2012-08-28T13:36:59.113 に答える
0

説明として、スクリプトが行っていることは、Google を使用して、LinkedIn のインデックス付きページを検索することです。具体的には、ユーザーの名前が表示されるページ (会社のプロフィール、仕事、ディスカッションなどではなく) を検索します。ターゲットの会社名と、おそらくその会社の標準的な電子メール形式がわかっているため (スクリプトの args で指定されているため)、検索は、会社に言及しているすべての LI プロファイル ページの結果を探し、名前を抽出し、e を生成するように見えます。・名前からメールアドレス。電子メール アドレスやドメインをスクレイピングするのではなく、名前をスクレイピングします。

実際には、LI がパブリック プロファイルを検索エンジンに表示する方法 (または多くのくだらない結果に対する許容度) の理解が不足していることを示しています。これは、結果がプロファイルではなく「ディレクトリ」ページでいっぱいになるためです。

しかし、その戦略的エラーは別として、あなたはスクリプトを間違って使用しています.Googleは文字ごとのワイルドカードをサポートしていません.ワイルドカードは主に、1つ以上の単語が間に入る可能性があることを示しています(または後/前-しかし、その間に最適に機能します)言い換えれば。ただし、ワイルドカードの動作は少しトリッキーで、すべてのケースについて完全に文書化されているわけではありません。したがって、これが後で失敗しなかったとしても、出力は、LinkedIn の非常に一般的な「サイト:」検索 (会社/ドメイン情報なし) に表示される最初の 100 名になります。これが誰にとってどのように役立つかわかりませんか?

その特定の行でスクリプトが失敗する理由については、検索結果項目の a-tags に対する BeautifulSoup.findAll 呼び出しの出力を反復処理しています。この場合、a.text の値と型は「None」であり、None には encode() メソッドがないため、エラーが発生します。BeautifulSoup には多くの優れたショートカットがありますが、エラーを追跡するのに混乱する可能性があります。findAll の結果は一連のタグであり、タグのデフォルトは findAll のように機能するため、a.text は、その反復サイクルの個々のタグで findAll('text') を呼び出すようなものだと思います。それがうまくいかない理由ははっきりとは言えません - 私はこのマシンに BeautifulSoup を持っていません.

関連部分:

user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7'
headers={'User-Agent':user_agent,}
p = 10

def gatherEmails(l,domain,p):
    print "Gathering emails from domain: "+domain
    emails = []
    for i in range(0,p):
        url = "http://www.google.co.uk/search?hl=en&safe=off&q=site:linkedin.com/pub+"+re.sub('\..*','',domain)+"&start="+str(i)+"0"
        request=urllib2.Request(url,None,headers)
        response = urllib2.urlopen(request)
        data = response.read()
        html = BeautifulSoup(data)
        for a in html.findAll('a',attrs={'class':'l'}):
            namesurname = re.sub(' -.*','',a.text.encode('utf8'))
            firstname = re.sub(' ([a-zA-Z])+','',namesurname).lower()
            surname = re.sub('([a-zA-Z])+ ','',namesurname).lower()
            sys.stdout.write("\r%d%%" %((100*(i+1))/p))
            sys.stdout.flush()
            if firstname != surname and not re.search('\W',firstname) and not re.search('\W',surname):                
                if l == '0' : # 1- firstname.surname@example.com
                    emails.append(firstname+" "+surname)
于 2012-08-28T14:07:22.197 に答える
0

3.0.8 より前のバージョンの Beautiful Soup を使用しています。get .text、.getText(separator)、および (Beautiful Soup 4 では) .get_text(separator) にアップグレードします。

于 2012-08-29T22:05:59.643 に答える