Haru57636433
@Haru57636433 (haru .)

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!

Seleniumでのスクレイピングでcss_selectorを用いてfor文で抽出したい

解決したいこと

css_selectorを使用して、for文でスクレイピングを使用としているのですが、値を取得できず、nullになってしまいます。どうすればfor文で抽出できますでしょうか?

        # detail_category
        wraps = driver.find_elements_by_class_name("js-track-project-card")
        for wrap in wraps:                
            det = wrap.find_elements_by_css_selector("#color-my-milo > div > div > div > div:nth-child(3) > div.pb3.pt3.px3-sm.px4 > div.ksr-green-700.medium > div.flex > a:nth-child(1)")
            if len(det) == 1:
                detail_categories.append(det[0].text)
            else:
                detail_categories.append("null")

image.png

自分で試したこと

xpathで取得しようとすると、グローバル領域で、全体から取得してしまうため、for文の中では使用できず、調べた結果css_selectorを使用しております。

抜き出そうとしているカテゴリーの要素に、固有の属性が無いため、右クリック⇒csspathをコピーして使用しているのですが、これもxpath同様にグローバル領域で見てしまっているのでしょうか?
このように、固有のidやclassが無い場合はどのようにすれば宜しいのでしょうか。

宜しくお願い致します。

0

1Answer

やりたいことはこれで合っていますかね?

detail_categories = []
wraps = driver.find_elements_by_class_name("js-track-project-card")
for wrap in wraps:                
    det = wrap.find_elements_by_tag_name('a')
    for a in det:
        if a.get_attribute("href").startswith('http://www.kickstarter.com/discover/categories/'):
            detail_categories.append(a.text)
            break
    else:
        detail_categories.append('null')
0Like

Comments

  1. @Haru57636433

    Questioner

    ありがとうございます!無事収集できました!🙌
    startswithメソッドを初めて知りました🙇

    ちなみに、もし分かればお伺いしたいのですが、私が最初に記述していたコードでは、cssセレクターで抽出対象を探した形だったのですが、うまく動作しなかった理由はわかりますでしょうか?💦
    例えば、cssセレクターの代わりにxpathで当初抽出していたのですが、xpathはグローバル領域を見に行ってしまうので、for文でうまく動作しないといったことが要因だったので、同様の理由かなと思ったのですが。。
  2. CSSは使い慣れてないので分からない、というのが正直なところですが、予想で良ければ、
    右クリックでコピーできるcssセレクタはページ全体から1つだけヒットするところまで詳しく条件を絞ったものなんだと思います。
  3. @Haru57636433

    Questioner

    なるほど、そういった可能性は考えておりませんでした💦
    ありがとうございました!調べてみます😊
  4. CSSセレクターでも絞り方を工夫すればできそうです。

    ```
    detail_categories = [a[0].text if (a:=i.find_elements_by_css_selector("div.pb3.pt3.px3-sm.px4 > div.ksr-green-700.medium > div.flex > a:nth-child(1)")) else 'null' for i in driver.find_element_by_id('projects_list').find_elements_by_css_selector(".js-track-project-card > div > div > div:nth-child(3)")]
    ```

Your answer might help someone💌