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

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

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

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python

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

Q&A

解決済

2回答

1143閲覧

BeautifulSoupでCSSセレクタを指定しても戻り値が何もない

piroron

総合スコア1

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python

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

0グッド

0クリップ

投稿2023/01/16 14:46

前提

※初学者のためおかしな表現等ありましたら、恐れ入りますがご指摘いただけますと幸いです。

pythonでスクレイピングを試みています。
BeautifulSoupで、CSSセレクタで要素する形を取ったのですが、上手く取得できず困っています。

実現したいこと

以下サイト内の各求人内の各項目を取得したいです。
https://www.baitorupro.com

具体的に試しているのは以下求人です。
https://www.baitorupro.com/care/detail/77886521/

例えば、以下のような情報の取得を実現したい。
募集職種項目から「介護職員・ヘルパー」
雇用形態項目から「アルバイト・パート」など。

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

[] ※戻り値が何もなく困っています※

該当のソースコード

python

1import requests 2from bs4 import BeautifulSoup 3 4URL = "https://www.baitorupro.com/care/detail/77886521/" 5 6res = requests.get(URL) 7soup = BeautifulSoup(res.text,"html.parser") 8 9print(soup.find_all("div.div01.at3194-jobType>div.div02>p"))

試したこと

print(soup5.select(".div01>div.div02>p")[2])
のように指定範囲を広げ、取得結果番号?を指定する方法も取りました。
ただ、求人ごとに求人内の項目数が異なるため、番号を一律に指定することができませんでした。


https://www.baitorupro.com/care/detail/82370992/
当求人の場合は、「募集職種」と「雇用形態」の間に「働く場所・業態」の情報が存在。指定した番号がズレる。

そのため、対象項目をピンポイントで取得するためには、より具体的なCSSセレクタの指定が必要と考え、上記コードを試みました。
ただ、上記例で言うとclass名「at3194-jobType」が対象項目をピンポイントで指定できる要素と考えているのですが、当該class名を条件に含めると、ことごとく[]で返ってきてしまいます。

※なお、Chromeの検証ツールのCSSセレクターで取得すると「at3194-jobType」が含まれていますが、requestsで取得したhtml上では当該class名が含まれず。。ただ、それ以外にピンポイントで指定できる要素もなく。お手上げの状況です。

お力をお貸しいただけますと幸いです。どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

上記例で言うとclass名「at3194-jobType」が対象項目をピンポイントで指定できる要素と考えているのですが、当該class名を条件に含めると、ことごとく[]で返ってきてしまいます。

print(soup) を実行して HTML コードを確認すると判るかと思いますが、at3194-jobType をクラス名に持つ要素は存在しません。JavaScript で動的に追加されていて、requests.get() で取得(HTTP GET メソッド)した HTML コードは実際には以下の様になっています。

html

1<div class="div01"> 2<h3 class="js-oneThirdScrollInnerTrigger" data-track="0"> 3<p>募集職種</p> 4</h3> 5<div class="div02"> 6<p>介護職員・ヘルパー</p> 7</div> 8</div> 9<div class="div01"> 10<h3 class="js-oneThirdScrollInnerTrigger" data-track="0"> 11<p>雇用形態</p> 12</h3> 13<div class="div02"> 14<p>アルバイト・パート</p> 15</div> 16</div>

なので、以下の様な CSS セレクタを指定します。

python

1# 募集職種項目から「介護職員・ヘルパー」 2print(soup.select_one('div:has(p:-soup-contains("募集職種")) > div.div02 > p')) 3# <p>介護職員・ヘルパー</p> 4 5# 雇用形態項目から「アルバイト・パート」など。 6print(soup.select_one('div:has(p:-soup-contains("雇用形態")) > div.div02 > p')) 7# <p>アルバイト・パート</p>

投稿2023/01/16 16:54

編集2023/01/16 16:58
melian

総合スコア19618

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

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

piroron

2023/01/17 09:20

melian様 具体的なご回答ありがとうございます! 試してみたところ、無事に成功いたしました。 このような指定方法が存在するのですね。。 大変勉強になります。 検証ツールのCopy selectorで取得した情報内の「at3194-jobType」が、どうしてrequests.get()で取得したHTML内にないのか理解できていませんでした。これがいわゆる動的サイトによる影響だったのですね。 解決策のご提示に加え、原因の解説までいただき感謝いたします。 この度はありがとうございました!
guest

0

CSSセレクタで要素する形を取ったのですが、上手く取得できず困っています。

soup.select()にChromeのCopy selectorで取得した値を渡せば所望のデータを取得できるかと思います。

※ディップ株式会社の利用規約には本サービスを利用した営業活動または営利を目的とした情報収集・提供・使用等の行為が禁止行為として明記されていますので商用利用は出来ないようです。ご注意ください。

投稿2023/01/16 15:58

meg_

総合スコア10577

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

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

piroron

2023/01/17 09:23

meg_様 ご回答ありがとうございます! また、利用規約の件も補足いただき感謝いたします。 規約内での利用に留めるよう、引き続き留意します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問