🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

860閲覧

href属性のemailアドレスを取得したいです。

yudai109

総合スコア18

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/11/15 15:13

前提・実現したいこと

https://tenshoku.mynavi.jp/jobinfo-99260-1-78-1/
こちらのサイトのemailアドレスを取得したいです。

発生している問題・エラーメッセージ

エラーメッセージはありませんが、このサイトのemailアドレスを取得しようとしてもNoneが返ってきます。

該当のソースコード

from bs4 import BeautifulSoup from selenium import webdriver import requests from urllib.parse import urljoin import time url_list = [] for n in range(1, 2): url = f"https://tenshoku.mynavi.jp/search/list/?pageNum={n}" res = requests.get(url) res.raise_for_status() soup = BeautifulSoup(res.text, "html.parser") for i in soup.find_all("a", class_='linkArrowS', text="詳細を見る"): elem = urljoin(url, i.get("href")).replace("/msg/", "/") # url_listに格納 url_list.append(elem) driver = webdriver.Chrome(executable_path='chromedriver') for m in url_list: driver.get(m) res = requests.get(m) res.raise_for_status() soup = BeautifulSoup(res.text, "html.parser") for k in soup.find_all("td", class_='email'): print(k.get("href"))

emailがないページでNoneが返ってくるのはわかりますが、emailがあるサイトでNoneになるのがなぜなのっかわかりません。
タグの指定の仕方が
悪いのでしょうか?

どなたかお願いします。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2019/11/15 15:40

Noneが返ってくるというのは、どこの文のことですか?
yudai109

2019/11/15 15:48

1ページずつ開きながら、メールアドレスを取得していて、 現状、 メールアドレスの記載のあるページではNoneが返ってきて、 メールアドレスのないページだと何も返ってこないで飛ばされます。
yudai109

2019/11/15 15:52

<td class="jobOfferTable__body email"> <a href="mailto:hotta-group@hotta-group.co.jp">hotta-group@hotta-group.co.jp</a></td> このタグの中にあるアドレスのみ抜き出したいのですが、どうすればいいのでしょうか。。
guest

回答2

0

ベストアンサー

ktdタグで、tdタグにhref属性は無いです。aタグを見ましょう。

投稿2019/11/15 22:49

otn

総合スコア85890

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yudai109

2019/11/15 23:13

aタグにclassなど、指定する物がない場合、どのように取得すれば良いのでしょうか??
otn

2019/11/15 23:29

指定して得たtdタグの下のaタグと、相対的に指定します。 k.find("a")
yudai109

2019/11/15 23:35

# スクレイピングの後にサイト開きまくる from bs4 import BeautifulSoup from selenium import webdriver import requests from urllib.parse import urljoin import time import re url_list = [] # email_regex = r"[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+" for n in range(1, 2): url = f"https://tenshoku.mynavi.jp/search/list/?pageNum={n}" res = requests.get(url) res.raise_for_status() soup = BeautifulSoup(res.text, "html.parser") for i in soup.find_all("a", class_='linkArrowS', text="詳細を見る"): elem = urljoin(url, i.get("href")).replace("/msg/", "/") # url_listに格納 url_list.append(elem) driver = webdriver.Chrome(executable_path='chromedriver') for m in url_list: driver.get(m) res = requests.get(m) res.raise_for_status() time.sleep(2) soup = BeautifulSoup(res.text, "html.parser") for k in soup.find_all("td", class_='email'): time.sleep(2) print(k.find("a")) こちらのコードで実行したところ、 emailアドレスないサイトでは何も出力されず、 emailアドレスのあるサイトではNoneと出力されました。。 aタグが取得できていないと言うことでしょうか??
otn

2019/11/15 23:49

k.find("a") だとaタグ自体なので、 print(k.find("a").get("href")) では? 途中段階も確認しましょう。 for k in soup.find_all("td", class_='email'): print("tdタグ ", k) print("aタグ ", k.find("a")) print("href ", k.find("a").get("href"))
yudai109

2019/11/16 00:07

(base) hiranohiroshidainoMacBook-Air:python yudai$ python minav_email_get.py tdタグ <td class="jobOfferTable__body email"> </td> aタグ None Traceback (most recent call last): File "minav_email_get.py", line 35, in <module> print("href ", k.find("a").get("href")) AttributeError: 'NoneType' object has no attribute 'get' こちらのエラーが出ました。。。 tdタグは取得できているようですが、その中に含まれているaタグが取得できていないようですね。。 なぜなのでしょうか。。 お時間をとっていただきありがとうございます。。 よろしくお願い致します。
otn

2019/11/16 03:23

後半はseleniumを使っていると思っていたら、seleniumは無関係で、 res = requests.get(m) の結果を見てるんですね。これはだめです。 seleniumの使い方を学習してseleniumの結果を見ましょう。
otn

2019/11/16 03:37

for x in driver.find_elements_by_css_selector("td.email"): print(x.find_element_by_tag_name("a").get_attribute("href")) ですかね。
yudai109

2019/11/16 11:51

seleniumを使えば良かったのですね。。 どこで何を使っているのか、自分の中でもぐちゃぐちゃになっていました。 しっかり勉強します! ありがとうございます!!
guest

0

メールアドレスがJavascriptで生成されているためJavascriptをレンダリングしてからスクレイピングをすればいい

python

1driver.get('https://tenshoku.mynavi.jp/jobinfo-99260-1-78-1/') 2 3html = driver.page_source.encode('utf-8') 4 5driver.quit() 6 7soup = BeautifulSoup(html, "html.parser") 8 9print(soup.select_one(".email > a").get("href"))

メールアドレス生成部分

javascript

1 $(function(){ 2 var jobOfferTableEmailObj = $(".email"); 3 4 if(jobOfferTableEmailObj.length == 0){ 5 return; 6 } 7 8 var emailCharArray = '104,111,116,116,97,45,103,114,111,117,112,64,104,111,116,116,97,45,103,114,111,117,112,46,99,111,46,106,112' 9 var emailIntArray = emailCharArray.split(',').map(function(item) { 10 return parseInt(item); 11 }); 12 var strEmail = String.fromCharCode.apply(this, emailIntArray); 13 var mailtoObj = "<a href='mailto:"+ strEmail +"'>"+ strEmail +"</a>"; 14 jobOfferTableEmailObj.append(mailtoObj); 15 });

メールアドレス変換確認

python

1c = '104,111,116,116,97,45,103,114,111,117,112,64,104,111,116,116,97,45,103,114,111,117,112,46,99,111,46,106,112' 2 3"".join([chr(i) for i in map(int, c.split(","))]) 4 5# 結果 6# 'hotta-group@hotta-group.co.jp'

投稿2019/11/16 01:11

編集2019/11/16 01:17
barobaro

総合スコア1286

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yudai109

2019/11/16 11:51

こちらでもできました! ありがとうございます!! javascriptを使ったスクレイピングの勉強の機会にもなりました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問