🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

986閲覧

seleniumとbeautifulsoupを用いたスクレイピングでのCSSセレクタの指定の方法

moosan

総合スコア2

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2021/03/12 12:55

編集2021/03/12 13:54

前提・実現したいこと

スクレイピング初学者です. このサイトを参考に自分でも何か作ってみようと思っていました.
https://qiita.com/Fujimon_fn/items/16adbd86fad609d993e8

そこでこのサイトで紹介されていたCSSセレクタの指定の方法についての質問です.

なぜこのようなCSSセレクタになっているのか文法がわかりません.
2つある"[0]"などが特にわからないので教えていただけると嬉しいです.

該当のソースコード

python

1#時間が書かれた部分をCSSセレクタで指定し、テキストを抜き出す 2time = soup.select(".routeSummary li.time")[0].select("span")[0].text

html

1<dl class="routeSummary"> 2 <dt> 3 <dd> 4 <ui> 5 <li class="time"> 6 <span>22:40発→<span class="mark">22:54着</span></span> 7

試したこと

python

1#時間が書かれた部分をCSSセレクタで指定し、テキストを抜き出す 2time = soup.select("#route01 > dl > dd:nth-of-type(1) > ul > li.time > span").text

サイトの通りにやればもちろんうまくいきます. しかしサイトの文法を理解することができなかったので, 私はchromeのcopyselectorを参考にして, その部分をこのコードに変えました. しかし以下のようなエラーが出ます.

AttributeError: ResultSet object has no attribute 'text'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?

エラーの意味もあまりわかりません.

あとhtmlへのリンクは以下のようになっています.
https://transit.yahoo.co.jp/search/result?flatlon=&fromgid=&from=%E6%9D%B1%E4%BA%AC&tlatlon=&togid=&to=%E6%96%B0%E5%AE%BF&viacode=&via=&viacode=&via=&viacode=&via=&y=2021&m=03&d=12&hh=22&m2=2&m1=5&type=1&ticket=ic&expkind=1&ws=3&s=0&al=1&shin=1&ex=1&hb=1&lb=1&sr=1&kw=%E6%96%B0%E5%AE%BF

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

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

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

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

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

meg_

2021/03/12 13:03

> なぜうまくいかないのでしょうか. 対象のhtmlはどうなっているのでしょうか? どう”うまくいかない”のでしょうか?
moosan

2021/03/12 13:56

追記しました. CSSセレクタの文法ミスが原因だと思われるので教えていただけると嬉しいです.
meg_

2021/03/12 15:04

Chromeの「copy selector」を使用したコードでエラーが出たのですか?であればサイトにアクセスする度に結果のhtmlが変わるということでしょうか? BearutifulSoupのCSSセレクタの使い方については結果がリストになるのだと思います。詳細については検索してください。色々説明記事が見つかります。
moosan

2021/03/12 16:30

selectメゾッドは結果をリストで返すのですね. そのことに留意した結果, 自分で作成したコードもselect_oneとすることでうまくいきました. 答えていただきありがとうございます.
guest

回答1

0

ベストアンサー

2つある"[0]"などが特にわからないので教えていただけると嬉しいです.

selectはリストを返すので、リストの要素(選択したHTMLノード)を取り出すためには添え字が必要です。先頭要素を取り出すので[0]を付けているのでしょう。ただ、それであればselectでなくselect_oneを使えば良いのに。

しかし以下のようなエラーが出ます.

上で説明したように、select結果はリストなのにそれを要素だと思いこんでtextプロパティを取ろうとしたからですね。

「リストとは何か?」がよく分からない場合は、まずPythonに入門しましょう。スクレイピングは入門し終わってからです。

投稿2021/03/12 15:06

otn

総合スコア85886

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

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

moosan

2021/03/12 16:33

[0]は配列の添え字だったのですね. selectメゾッドはリストで返すということもあり, 納得がいきました. textプロパティをリストに対して用いるのは確かにおかしいですね. 自分の考えたものも, 「select」を「select_one」にした結果うまくいきました. 回答ありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問