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!

Xpathを用いて、スクレイピングしていますが、うまくテキストを抽出できません。

解決したいこと

下記サイトの、各プロジェクト名を抽出したいと思っています。
https://www.kickstarter.com/discover/advanced?term=Kitchen+as&woe_id=0&sort=magic&seed=2700321&page=4

・Selenium で無限スクロール⇒全情報取得⇒classなどを指定してプロジェクト名を抽出
という流れを想定しております。
プロジェクト名がh3タグなので、
find_element_by_tag_name("h3").text
こちらで最初は抽出してみたのですが、最初に5個ほど、プロジェクトタイトルと関係のない情報も抽出してしまうため、ピンポイントでタイトルを指定したいと思っています。

その流れでXpathを使用しているのですが、返却が空の状態になってしまっております。

該当するソースコード

        pids = []
        h3 = []
        elems = driver.find_elements_by_class_name("js-track-project-card")
        for elem in elems:
            pid = elem.get_attribute("data-project_pid")
            pids.append(pid)

        wraps = driver.find_elements_by_xpath("//div[contains(@class, 'flex-wrap')]")
        for wrap in wraps:
            childs = wrap.find_elements_by_xpath("//div[contains(@class, 'js-track-project-card')]")
            title = childs.find_element_by_tag_name("h3").text
            h3.append(title)

自分で試したこと

この状態で取得すると、一つ目のpid=プロジェクトidは抽出できています。
h3が[]と空の状態です。

【サイトの構成】
抽出したいプロジェクトタイトルは、下図Excelのスクショのような構造になっており、

wrapperで12個のプロジェクトを包んでおり、
スクロールごとに現れ、divの階層が一つ深くなる(div[3]⇒div[4]になる)という仕組みです。

自分のイメージでは、wrapperをfor文でループ
⇒その中でプロジェクトをループしつつ、h3タグの要素を抽出し、テキスト(プロジェクトタイトル)を抽出
⇒h3[]リストに格納し
⇒print(h3)
というイメージですが、うまくいきません。

取得の仕方が間違っておりますでしょうか?💦
恐縮ですが、お時間ございます方がいらっしゃれば、ご回答頂けると幸いでございます🙇
宜しくお願い致します。

【xpath構造】
image.png

【wrapperの構成】
image.png

【プロジェクトの構成】
image.png

0

1Answer

childs はリストオブジェクトなので childs.find_element_by_tag_name は呼べません。 そこでエラーメッセージが出力されているはずです。

以下のように child を一つずつ処理してください。

for child in childs:
    title = child.find_element_by_tag_name("h3").text
    h3.append(title)

また、 XPath 式を工夫すれば wrapper の中の h3 を直接取り出すことができます。

h3_elems = driver.find_elements_by_xpath("//div[contains(@class, 'flex-wrap')]//h3")
for elem in h3_elems:
    h3.append(elem.title)

うまくいかないときは途中の変数を print() して処理が意図通りに進んでいるか確認する癖をつけるといいですよ。

0Like

Comments

  1. @Haru57636433

    Questioner

    @uasi様

    いつもありがとうございます😂🙇
    無事抽出できました。
    細かい確認方法もしっかり実施して取り組むようにします🙇

Your answer might help someone💌