質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%

Q&A

解決済

1回答

1620閲覧

スクレイピング実行時のjavascript:void(0)

53243

総合スコア6

0グッド

0クリップ

投稿2022/01/15 07:48

編集2022/01/15 07:49

前提・実現したいこと

求人サイトのエン転職をスクレイピングしているときです。
目的は企業のurlと企業名の取得です。
参考:リンク内容
と企業名の取得はできましたが、
urlを取得しようとすると以下が出力されました。

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

============================== 0 ============================== 株式会社グロップ(グロップグループ) javascript:void(0) ============================== 1 ============================== 株式会社グロップ(グロップグループ) javascript:void(0) ============================== 2 ============================== 株式会社ウィルオブ・ワーク(ウィルグループ) javascript:void(0)

該当のソースコード

python

1 2from bs4 import BeautifulSoup 3import requests 4import pandas as pd 5from time import sleep 6 7base_url = 'https://employment.en-japan.com/search/search_list/?areaid=23_24_21_50&occupation=101000_102500_103000_103500_104500_105000_105500_109000&aroute=1&pagenum=1&arearoute=1' 8d_list = [] 9for i in range(1, 23): 10 url = base_url.format(i) 11 r = requests.get(url, timeout=3) 12 sleep(3) 13 14 r. raise_for_status() 15 16 soup = BeautifulSoup(r.content, 'lxml') 17 companies = soup.find_all('div', class_='unitBase') 18 19 for i, company in enumerate(companies): 20 print('='*30, i, '='*30) 21 company_name = company.find('span', class_='company').text 22 page = company.find('a', class_='toDesc').get('href') 23 print(company_name) 24 page_url = 'https://employment.en-japan.com/' + page 25 26 sleep(2) 27 28 page_r = requests.get(page_url, timeout=3) 29 page_r.raise_for_status() 30 31 page_soup = BeautifulSoup(page_r.content, 'lxml') 32 company_url = page_soup.find('a', class_='previewOption') 33 34 if company_url: 35 company_url = company_url.get("href") 36 print(company_url) 37 else: 38 print('特殊ページ:') 39 company_url = soup.select_one('.companyTable > tbody > tr:nth-of-type(3) > td > a').get('href') 40 41 42 d_list.append({ 43 'company_name': company_name, 44 'company_url': company_url 45 }) 46 47df = pd.DataFrame(d_list) 48df.to_csv('company_en', index='None', encoding='utf-8-sig') 49

試したこと

seleniumを使ったほうがいいかもしれないと思いやってみましたが、
自分では解決には至りませんでした。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

melian

2022/01/15 08:39

a 要素の href 属性ではなく text に URL が書かれていますので、 company_url = company_url.text としてみてはどうでしょうか。
53243

2022/01/15 08:55 編集

回答ありがとうございます。 浅い考えでコーディングしてすいません。 これで一部のurlは取得できましたが、5つ目から以下のようにAttributeErrorが出てしまいました。 .textもやってみましたが、何も変わりませんでした。 seleniumを使えということでしょうか? Traceback (most recent call last): File "c:/Users/genge/Desktop/python_practice/lesson9.py", line 38, in <module> company_url = soup.select_one('.companyTable > tbody > tr:nth-of-type(3) > td > a').get('href') AttributeError: 'NoneType' object has no attribute 'get'
melian

2022/01/15 08:57

特殊ページの方は動的に生成されている様なので、確かに selenium を使う方が適切かもしれませんね。
53243

2022/01/15 12:54 編集

seleniumで各urlにアクセスしてから、ページのHTMLを取得する。 そのあとにHTMLをスクレピングするべきなのでしょうか?
melian

2022/01/16 04:37 編集

回答に書きましたが、selenium を使わなくても情報は取れそうです。ただ、最初のページでしか動作確認をしていませんので、2ページ目以降でなんらかのエラーが発生するかもしれません。
53243

2022/01/16 06:09

ご丁寧な説明ありがとうございます。
guest

回答1

0

ベストアンサー

すみません、特殊ページの方は動的に生成されているのではなく、iframe(インラインフレーム)の中にありました。なので、以下の様にすると必要な情報を取得できるのですが、企業によっては iframe が無かったり、WEB サイトの記載が無い事があって、それらの場合は「WEBサイト不明」としています。

python

1 page_soup = BeautifulSoup(page_r.content, 'lxml') 2 company_url = page_soup.find('a', class_='previewOption') 3 4 if company_url: 5 company_url = company_url.text 6 print(company_url) 7 else: 8 company_url = page_soup.select_one('#recruitFrame') 9 if company_url: 10 company_url = company_url.get('src') 11 company_page = requests.get(company_url, timeout=3) 12 company_soup = BeautifulSoup(company_page.content, 'lxml') 13 company_url = company_soup.select_one('.companyTable > tbody > tr:nth-of-type(3) > td > a') 14 if company_url: 15 company_url = company_url.text 16 else: 17 company_url = 'WEBサイト不明' 18 else: 19 company_url = 'WEBサイト不明' 20 21 print(f'特殊ページ:{company_url}') 22 23 d_list.append({ 24 'company_name': company_name, 25 'company_url': company_url 26 })

投稿2022/01/16 04:35

melian

総合スコア19805

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問