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

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

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

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

Q&A

解決済

1回答

446閲覧

Pythonのスクレイピングでbs4を使用して特定の要素を取り出したい。

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2022/07/30 17:15

前提

Pythonでbs4を使って、特定の見出し部分以下にある要素のみを取り出したいです。

実現したいこと

例えば以下のようなページから、「にんじん」、「キャベツ」、「トマト」のURLとアンカーテキストを取り出す場合はどのようにすればいいのでしょうか。

<title>タイトル</title>

<div class="abcde">
<h2>果物</h2>
<a href="URL">りんご</a>
<a href="URL">みかん</a>
<a href="URL">ぶどう</a>

<h2>野菜</h2>
<a href="URL">にんじん</a>
<a href="URL">キャベツ</a>
<a href="URL">トマト</a>

<h2>飲み物</h2>
<a href="URL">お茶</a>
<a href="URL">お水</a>
<a href="URL">牛乳</a>

</div>

試したこと

以下のコードでは、「果物」、「野菜」、「飲み物」全てのaタグを取得してしまいます。

url = "https://www.〇〇〇〇"
r = requests.get(url)

so = BeautifulSoup(r.text, "html.parser")
contents = so.find(class_="abcde")

get_a = contents.find_all("a")

お手数おかけしますが、ご教授いただけますと幸いです。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/07/31 05:51 編集

早々のご回答誠にありがとうございます。 試してみたのですが、html = ''' 〜〜〜 '''の部分をURLから引っ張ってくるように、以下のように書き換えて実行したのですが、変数の中身は「[]」となり、目的のURLとテキストが所得できませんでした。 なお<h2></h2>の部分は、正確には以下のような形となっています。 <h2><span id="△△">野菜</span></h2> <h2><span id="□□">飲み物</span></h2> html = ''' 〜〜〜 ''の形であれば取得できるのですが。 再質問となり大変お手数おかけします。 url = "https://www.〇〇〇〇" r = requests.get(url) soup = BeautifulSoup(r.text, "html.parser") elms = soup.select('h2:-soup-contains("野菜") ~ a:has(~ h2:-soup-contains("飲み物"))') print (elms) # []
guest

回答1

0

ベストアンサー

以下のようなサイトのサイトマップから

実際には a 要素ではなく ul 要素になっているので、a:has(...)ul:has(...) に変更します。

python

1from bs4 import BeautifulSoup 2import requests 3 4url = "https://type.jp/tensyoku-knowhow/contents-sitemap/" 5r = requests.get(url) 6r.encoding = r.apparent_encoding 7 8soup = BeautifulSoup(r.text, "html.parser") 9elms = soup.select_one('h3:-soup-contains("「私に向いているかも!」を見つける職種図鑑") ~ ul:has(~ h3:-soup-contains("ここまで知っておけば失敗しない!応募前におさえるべき「内定後のやることリスト」"))') 10 11a = elms.select('a') 12url, anchor = [], [] 13for e in a: 14 url.append(e['href']) 15 anchor.append(e.text) 16 17print(f'{url = }') 18print(f'{anchor = }')

投稿2022/07/30 18:43

編集2022/07/31 08:33
melian

総合スコア19618

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

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

退会済みユーザー

退会済みユーザー

2022/07/31 05:53

早々のご回答誠にありがとうございます。 試してみたのですが、html = ''' 〜〜〜 '''の部分をURLから引っ張ってくるように、以下のように書き換えて実行したのですが、変数の中身は「[]」となり、目的のURLとテキストが所得できませんでした。 なお<h2></h2>の部分は、正確には以下のような形となっています。 <h2><span id="△△">野菜</span></h2> <h2><span id="□□">飲み物</span></h2> html = ''' 〜〜〜 ''の形であれば取得できるのですが。 再質問となり大変お手数おかけします。 url = "https://www.〇〇〇〇" r = requests.get(url) soup = BeautifulSoup(r.text, "html.parser") elms = soup.select('h2:-soup-contains("野菜") ~ a:has(~ h2:-soup-contains("飲み物"))') print (elms) # []
melian

2022/07/31 06:10

文字コードの問題かもしれませんので、下記の「# 追加」と書いた行を入れて試してみてください。 r = requests.get(url) r.encoding = r.apparent_encoding # 追加
退会済みユーザー

退会済みユーザー

2022/07/31 06:35

早々にご返信いただき誠にありがとうございます。 r.encoding = r.apparent_encoding の箇所を追加し実行してみましたが、結果は「[]」でした。 試しに同じような構造の他のブログでも試してみましたが、結果は「[]」でした。
melian

2022/07/31 06:47

具体的な URL を教えてもらえれば、こちらで調べることが可能です。
退会済みユーザー

退会済みユーザー

2022/07/31 08:29 編集

何度も申し訳ございません。 以下のようなサイトのサイトマップから特定の要素を取り出したいと考えています。 https://type.jp/tensyoku-knowhow/contents-sitemap/ 例えば、「「私に向いているかも!」を見つける職種図鑑」の以下にあるタイトルとそのURLだけを取得したい場合です。この場合は、見出しがh3だったため、h2からh3に変更しています。 大変お手数おかけします。 from bs4 import BeautifulSoup import requests url = "https://type.jp/tensyoku-knowhow/contents-sitemap/" r = requests.get(url) r.encoding = r.apparent_encoding soup = BeautifulSoup(r.text, "html.parser") elms = soup.select('h3:-soup-contains("「私に向いているかも!」を見つける職種図鑑") ~ a:has(~ h3:-soup-contains("ここまで知っておけば失敗しない!応募前におさえるべき「内定後のやることリスト」"))') print (elms) # []
melian

2022/07/31 08:33

回答を更新しました。
退会済みユーザー

退会済みユーザー

2022/07/31 08:59

無事に解決できました! ul要素を取らなければならなかったのですね。 そのあとにa要素を取ると理解しました。 私の質問の仕方が間違っていて、申し訳ございません。 誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問