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

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

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

3回答

2551閲覧

スクレイピングで、a要素のhrefを取り出し、配列の文字にある'msg/'の文字を取り除いて表示したいです。

yudai109

総合スコア18

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2019/10/31 11:34

前提・実現したいこと

スクレイピングで、a要素のhrefを取り出し、配列の文字にある'msg/'の文字を取り除いて表示したいです。
https://tenshoku.mynavi.jp/search/list/
上記のサイトにある「▶︎詳細をみる」にあるhrefを取り出したいと考えています。

現状、スクレイピングすることはできていいますが、要素が2つずつスクレイピングされてしまいます。
なぜなのかわからないため、教えていただきたいです。

最後の数字の部分が2ずつ出力されてしまいます。

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

https://tenshoku.mynavi.jp//jobinfo-248825-1-4-1/?ty=rzs&searchId=1209225192&pageNum=1&showNo=1 https://tenshoku.mynavi.jp//jobinfo-248825-1-4-1/?ty=rzs&searchId=1209225192&pageNum=1&showNo=1 https://tenshoku.mynavi.jp//jobinfo-220100-1-31-1/?ty=rzs&searchId=1209225192&pageNum=1&showNo=2 https://tenshoku.mynavi.jp//jobinfo-220100-1-31-1/?ty=rzs&searchId=1209225192&pageNum=1&showNo=2 https://tenshoku.mynavi.jp//jobinfo-184770-1-48-1/?ty=rzs&searchId=1209225192&pageNum=1&showNo=3 https://tenshoku.mynavi.jp//jobinfo-184770-1-48-1/?ty=rzs&searchId=1209225192&pageNum=1&showNo=3 https://tenshoku.mynavi.jp//jobinfo-161900-1-281-1/?ty=0&searchId=1209225192&pageNum=1&showNo=4 ・ ・ ・

該当のソースコード

python

1from bs4 import BeautifulSoup 2import requests 3 4res = requests.get('https://tenshoku.mynavi.jp/search/list/') 5res.raise_for_status() 6soup = BeautifulSoup(res.text, "html.parser") 7elems = soup.select('.linkArrowS') 8 9for elem in elems: 10 elem_rink = elem.get('href') 11 if 'msg/' in elem_rink: 12 elem_rp = elem_rink.replace('msg/', '') 13 print('https://tenshoku.mynavi.jp/' + elem_rp) 14 else: 15 print('https://tenshoku.mynavi.jp/' + elem_rink) 16

試したこと

・elseを外した。

補足情報(FW/ツールのバージョンなど)

ifの条件がtrueの時はifの中身が実行されてelseの中身が実行されず、繰り返し処理をすると思っているのですが、間違っているのでしょうか?

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

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

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

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

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

guest

回答3

0

find_allだとstringでテキストを抽出対象にできます

https://www.crummy.com/software/BeautifulSoup/bs4/doc/#the-string-argument

URLはurljoinで結合しています

python

1from bs4 import BeautifulSoup 2import requests 3from urllib.parse import urljoin 4 5url = "https://tenshoku.mynavi.jp/search/list/" 6 7res = requests.get(url) 8res.raise_for_status() 9 10soup = BeautifulSoup(res.content, "html.parser") 11 12for i in soup.find_all("a", class_="linkArrowS", string="詳細を見る"): 13 print(urljoin(url, i.get("href")).replace("/msg/", "/"))

投稿2019/11/01 02:30

barobaro

総合スコア1286

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

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

0

ベストアンサー

そもそも何が起こっているか

ブラウザでこのサイトの画面を開いたら
どこか適当なところで右クリックをして検証をクリックし、開発者ツールを開いてください。

上の方にElements, Console, Sources...とありますが、
このうちConsoleを選んでください。
そしてそこにjsを打ち込み、エンターキーを押下します。

JavaScript

1document.getElementsByClassName('linkArrowS')[i]

iには数字を代入してください0, 1, 2, 3, 4...といった具合です。

すると「企業からのメッセージを見る」と「詳細を見る」が交互に現れていると思います。
そしてこの2つ、href属性が全く同じであることを確認してください。

あなたはclass属性がlinkArrowSの要素を全て取り出していたので、
この両方のタグを上から順番に処理していったため、
printした際に同じものが2つ現れてしまったというわけです。

どうすれば「詳細を見る」だけ取得できるか

これはDOM毎に大きく変わってきますが、
今回の場合はaタグで表示されるテキストで取得するのが最適だと思います。

python

1for elem in elems: 2 if elem.string == '詳細を見る': 3 elem_rink = elem.get('href') 4 if 'msg/' in elem_rink: 5 elem_rp = elem_rink.replace('msg/', '') 6 print('https://tenshoku.mynavi.jp/' + elem_rp) 7 else: 8 print('https://tenshoku.mynavi.jp/' + elem_rink)

投稿2019/10/31 17:45

shirai

総合スコア1290

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

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

yudai109

2019/11/01 00:33

とてもわかりやすい解説ありがとうございます!! 初学者にもわかりやすい文章で書いていただき、理解しやすかったです!!! 解決策まで提示していただきありがとうございました! 今後ともよろしくお願いいたします!
guest

0

もとのHTMLに同じデータが2つずつあるからでは?

ifの条件がtrueの時はifの中身が実行されてelseの中身が実行されず、繰り返し処理をすると思っているのですが、間違っているのでしょうか?

合ってます。

投稿2019/10/31 12:13

otn

総合スコア85893

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

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

yudai109

2019/10/31 13:52

ご回答ありがとうございます! 要素は2つないと思います。。 仮に、 from bs4 import BeautifulSoup import requests res = requests.get('https://tenshoku.mynavi.jp/search/list/') res.raise_for_status() soup = BeautifulSoup(res.text, "html.parser") elems = soup.select('.linkArrowS') for elem in elems: elem_rink = elem.get('href') if 'msg/' in elem_rink: elem_rp = elem_rink.replace('msg/', '') print('https://tenshoku.mynavi.jp/' + elem_rp) と実行すると ・ ・ ・ https://tenshoku.mynavi.jp//jobinfo-61494-1-51-1/?ty=0&searchId=1209246364&pageNum=1&showNo=43 https://tenshoku.mynavi.jp//jobinfo-61494-1-51-1/?ty=0&searchId=1209246364&pageNum=1&showNo=43 https://tenshoku.mynavi.jp//jobinfo-214970-1-1-1/?ty=0&searchId=1209246364&pageNum=1&showNo=44 https://tenshoku.mynavi.jp//jobinfo-214970-1-1-1/?ty=0&searchId=1209246364&pageNum=1&showNo=44 https://tenshoku.mynavi.jp//jobinfo-224893-1-8-1/?ty=0&searchId=1209246364&pageNum=1&showNo=45 https://tenshoku.mynavi.jp//jobinfo-166348-1-14-1/?ty=0&searchId=1209246364&pageNum=1&showNo=46 https://tenshoku.mynavi.jp//jobinfo-260659-1-1-1/?ty=0&searchId=1209246364&pageNum=1&showNo=47 https://tenshoku.mynavi.jp//jobinfo-260659-1-1-1/?ty=0&searchId=1209246364&pageNum=1&showNo=47 https://tenshoku.mynavi.jp//jobinfo-188726-1-3-1/?ty=0&searchId=1209246364&pageNum=1&showNo=48 https://tenshoku.mynavi.jp//jobinfo-210431-1-15-1/?ty=0&searchId=1209246364&pageNum=1&showNo=49 https://tenshoku.mynavi.jp//jobinfo-210431-1-15-1/?ty=0&searchId=1209246364&pageNum=1&showNo=49 https://tenshoku.mynavi.jp//jobinfo-163205-1-29-1/?ty=0&searchId=1209246364&pageNum=1&showNo=50 のように、'/msg'がないhref属性の値は1つしか表示されません。。
otn

2019/10/31 14:08

上記だと、12個中4組ダブってますよね???
yudai109

2019/10/31 14:11 編集

これを、質問に書いてあるソースコードで出力するとこのようになります。 これは、同じデータがあるかもしれないことと関係あるのでしょうか? ・ ・ ・ https://tenshoku.mynavi.jp//jobinfo-61494-1-51-1/?ty=0&searchId=1209248904&pageNum=1&showNo=43 https://tenshoku.mynavi.jp//jobinfo-61494-1-51-1/?ty=0&searchId=1209248904&pageNum=1&showNo=43 https://tenshoku.mynavi.jp//jobinfo-214970-1-1-1/?ty=0&searchId=1209248904&pageNum=1&showNo=44 https://tenshoku.mynavi.jp//jobinfo-214970-1-1-1/?ty=0&searchId=1209248904&pageNum=1&showNo=44 https://tenshoku.mynavi.jp//jobinfo-224893-1-8-1/?ty=0&searchId=1209248904&pageNum=1&showNo=45 https://tenshoku.mynavi.jp//jobinfo-224893-1-8-1/?ty=0&searchId=1209248904&pageNum=1&showNo=45 https://tenshoku.mynavi.jp//jobinfo-166348-1-14-1/?ty=0&searchId=1209248904&pageNum=1&showNo=46 https://tenshoku.mynavi.jp//jobinfo-166348-1-14-1/?ty=0&searchId=1209248904&pageNum=1&showNo=46 https://tenshoku.mynavi.jp//jobinfo-260659-1-1-1/?ty=0&searchId=1209248904&pageNum=1&showNo=47 https://tenshoku.mynavi.jp//jobinfo-260659-1-1-1/?ty=0&searchId=1209248904&pageNum=1&showNo=47 https://tenshoku.mynavi.jp//jobinfo-188726-1-3-1/?ty=0&searchId=1209248904&pageNum=1&showNo=48 https://tenshoku.mynavi.jp//jobinfo-188726-1-3-1/?ty=0&searchId=1209248904&pageNum=1&showNo=48 https://tenshoku.mynavi.jp//jobinfo-210431-1-15-1/?ty=0&searchId=1209248904&pageNum=1&showNo=49 https://tenshoku.mynavi.jp//jobinfo-210431-1-15-1/?ty=0&searchId=1209248904&pageNum=1&showNo=49 https://tenshoku.mynavi.jp//jobinfo-163205-1-29-1/?ty=0&searchId=1209248904&pageNum=1&showNo=50 https://tenshoku.mynavi.jp//jobinfo-163205-1-29-1/?ty=0&searchId=1209248904&pageNum=1&showNo=50
otn

2019/10/31 14:17

はい。 同じデータがあるから、同じデータが出力されます。
yudai109

2019/10/31 14:22

サイトをよくみたら同じデータがありました! ありがとうございます!
yudai109

2019/10/31 14:24

ただ、.linkArrowSというクラスをもつaダグのhref属性の値は1つしかありません。 これだけを取り出すことはできるのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問