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

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

詳細はこちら
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

792閲覧

「Bautifulsoup」class名を指定してるのに、何も返ってこない。

hana-tera

総合スコア1

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/01/10 11:38

編集2021/01/11 02:22
コード ```### 前提・実現したいこと 下記サイト [リンク内容](https://store-tsutaya.tsite.jp/storelocator/detail/recycle.html?storeId=0908#visual02) から「タイトル」と「価格」を取り出してスプレットシートに書き出そうとしています。 下記のコードはHTMLの <td class="byprice">26,000円</td> の部分からクラス名を指定して elems_price に入れようとしてます。ですがこのコードでは print(elmes_price)で何も返って来ません。classの指定方法をfind,find_all,selectと何パターンか 試したのですがどれでやっても何も返されませんでした。 自分では何が間違ってるのかわからず、どなたかご教授頂けませんか。 ### 該当のソースコード ```python from selenium import webdriver import time import pandas as pd from bs4 import BeautifulSoup import urllib.request as req import requests import gspread from oauth2client.service_account import ServiceAccountCredentials from gspread_dataframe import set_with_dataframe browser = webdriver.Chrome() browser.get('https://store-tsutaya.tsite.jp/storelocator/detail/recycle.html?storeId=0908') time.sleep(3) url = browser.current_url html = req.urlopen(url) soup = BeautifulSoup(html,'html.parser') elems_price = soup.select('.byprice') print(elems_price )

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/01/10 17:06

ソースコードは code ブロックに貼ってください。 読みづらいだけで回答者の意欲をそぐ場合があります。 リンクは リンクの挿入 を使用してください。 回答者の手間が減ります。
hana-tera

2021/01/10 18:27

ご指摘ありがとうございます。修正しました。
退会済みユーザー

退会済みユーザー

2021/01/10 19:06

こんな時間までご苦労様です。 先程の修正依頼に、Pythonタグの追加を書き忘れました。 是非、Pythonプロの目にとまるように工夫しましょう。
退会済みユーザー

退会済みユーザー

2021/01/10 19:12

遅ればせながらソースを実行しようとしたのですが NameError: name 'webdriver' is not defined で実行できません。 ソースは問題が疑われる個所だけでなく、フルで提示してください。
hana-tera

2021/01/11 02:22

何度もご指摘ありがとうございます。タグとソース修正しました。
guest

回答2

0

soupの中身を確認したところ、そもそもbypriceが含まれていないようです。

Python

1from selenium import webdriver 2import chromedriver_binary 3import time 4import urllib.request 5from bs4 import BeautifulSoup 6 7browser = webdriver.Chrome() 8browser.get('https://store-tsutaya.tsite.jp/storelocator/detail/recycle.html?storeId=0908') 9time.sleep(3) 10 11url = browser.current_url 12 13html = urllib.request.urlopen(url) 14soup = BeautifulSoup(html,'html.parser') 15 16print(soup) #add for debug. 17 18elems_price = soup.select('.byprice') 19print(elems_price )

投稿2021/01/10 20:29

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hana-tera

2021/01/11 02:31

ご回答ありがとうございます。ご指摘の通り確かにbypriceが含まれてないようです… それどころか自分で確認した限りでは抽出したいテーブルの要素全てが含まれてませんでした。 googleクローム上でデベロッパーツールでは確認出来きたのですが、それが何故ないかわかりません。 取得の仕方が間違ってるのか、それとも解析の部分が間違ってるのでしょうか?
guest

0

ベストアンサー

print(html)して、HTMLを確認しましょう。

投稿2021/01/10 11:56

otn

総合スコア85882

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

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

hana-tera

2021/01/10 12:17

ご回答ありがとうございます。ご指摘の通りprint(html)を試してみまたのですが 返ってきた<http.client.HTTPResponse object at 0x000002131A8D8220>がどういう意味なのか自分にはわからず…。 「HTMLを確認しましょう。」との事でしたので、Print(soup)でHTMLを見てみました。 自分では<td class="byprice">26,000円</td>の部分が見つけられたかったのですがそれが原因なのでしょうか?googleクロームのデベロッパーツールで見るHTMLには確かにあるんですが。。。
otn

2021/01/10 14:55

ああ、失礼。 変数名にだまされました。htmlという変数名なので、てっきり、HTMLが入っていると早合点しました。 print(req.urlopen(url).read()) で、HTMLが表示されます。
otn

2021/01/11 06:18

おそらく、JavaScriptで動的に追加した要素なので、req.urlopen(url)で得られる追加前のHTMLだけを見ても駄目です。 JavaScriptを使うために、ブラウザ+Selenium等を使いましょう。
hana-tera

2021/01/28 22:43

長らく放置してしまい申し訳ございませんでした。JavaScriptを使用してるページはseleniumが必要なんですね。実は勉強しているうちに目的に対して別なアプローチを見つけたので質問自体はまだ解決には至ってないのですがいったん質問は締めさせていただきます。ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問