yuhtaryouko
@yuhtaryouko (Yuta Kato)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

商品名などのデータを集めたいが、クラス名などが共通してしまっている

解決したいこと

ポケモンカードの公式ページから「商品名・発売日・金額」のデータを収集して、pandasを通じてエクセルにまとめたいです。
RequestsとBeautifulSoupを使っているのですが、抜き出したい商品名などのデータに共通のクラス名が使われており難儀しています。

発生している問題・エラー

from bs4 import BeautifulSoup as bs
import requests
import pandas as pd
url = "https://www.pokemon-card.com/products/"

res = requests.get(url)

soup = bs(res.text, 'html.parser')

dates = []
names = []
prices = []


contents = soup.select('#productsTab_expansionPack')

まず、URLを開くと商品一覧にアクセスできるのですが、
「拡張パック」「構築デッキ」「その他の商品」「周辺グッズ」のソースすべてが同じ階層にある(表現が下手くそですみません)

この中で、「拡張パック」(クラス名:KSTabContents_item current id=productsTab_expansionPack)だけをデータの抽出対象にしたいです。

この下に「List-product」と「List_item」というクラスがあるので、本当はこのクラス名を指定したいのですが、「構築デッキ」「その他の商品」などにも「List-product」と「List_item」というクラス名が使われているので、そちらも抽出してしまうため使えません。

image.png

image.png

このようにid=productsTab_expansionPackのなかの
「List_item」だけを抽出するにはどのように書けばよいのでしょうか??

自分で試したこと

contents = soup.find('li', class_='KSTabContents_item current')

ここで指定したcontentsを再びBeautifulSoupに入れられないかと思ったのですが、type関数(?)でチェックしたらテキスト型ではなかったので頓挫しています。

0

2Answer

このようにid=productsTab_expansionPackのなかの
「List_item」だけを抽出するにはどのように書けばよいのでしょうか??

list_items = soup.select('#productsTab_expansionPack .List_item')

と書けます。


select() メソッドは CSS セレクタで要素を検索できます。

#productsTab_expansionPack .List_item は「id が productsTab_expansionPack である要素の子孫で、 class が List_item である要素」すべてにマッチします。

2Like

Comments

  1. @yuhtaryouko

    Questioner

    cssセレクタを組み合わせることでできるようになりました。

    ただ、1枚目の写真にあるList_itemが28個あるのですが、

    select(#productsTab_expansionPack .List_item)とすると、なぜか20個までしかヒットしません。
    あとの8個はなぜ出てこないのか、予測つく方いらっしゃいませんでしょうか。

Comments

  1. @yuhtaryouko

    Questioner

    きちんと狙い通り動作させられました。誠にありがとうございました!

Your answer might help someone💌