質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
スクレイピング

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

Python 3.x

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

Q&A

解決済

2回答

9568閲覧

BeautifulSoupを使ってスクレイピング

cir

総合スコア19

スクレイピング

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

Python 3.x

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

0グッド

0クリップ

投稿2017/05/31 05:28

###前提・実現したいこと
あるページ(イトーヨーカドー)から商品名と価格を取得するためのコードを書いていたところ、以下のエラーメッセージが発生しました。

###発生している問題・エラーメッセージ

Traceback (most recent call last): File "ito.py", line 11, in <module> name = i.select_one('li.goodsitem.list_even > p.goodsnameblock').get_text().split() AttributeError: 'NoneType' object has no attribute 'get_text'

###該当のソースコード

python

1import requests 2from urllib.request import urlopen 3from bs4 import BeautifulSoup 4 5html = requests.get("https://www.iy-net.jp/nspc/getproducts.do?shopcd=00126&categoryCode=20002") 6soup = BeautifulSoup(html.text, "html.parser") 7 8 9for i in soup.select('ul > li'): 10 11 name = i.select_one('li.goodsitem.list_even > p.goodsnameblock').get_text().split() 12 13 price = i.select_one('li.goodsitem.list_even > div.goodspriceblock').get_text().split() 14 15 print(name,price)

###試したこと
エラーメッセージは、None型のオブジェクトで、get_textは使えないということなので、CSSセレクタの指定方法が悪いと思い、色々試したのですが、うまくいかなかったので、ご教授頂ければと思います。

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

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

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

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

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

guest

回答2

0

私の環境ではtell_kさんのコードで正常に出力されますね。

python

1import requests 2from bs4 import BeautifulSoup 3 4html = requests.get("https://www.iy-net.jp/nspc/getproducts.do?shopcd=00126&categoryCode=20002") 5soup = BeautifulSoup(html.text, "html.parser") 6 7for i in soup.select('ul > li.goodsitem'): 8 name = i.select_one('a.goodsname').text.strip() 9 price = i.select_one('p.goodsprice').text.strip() 10 print(name, price)

そちらの環境を教えてください、私の環境は以下のとおりです。

OS:openSUSE
Python: 3.6
BeautifulSoup: 4.6.0

BeautifulSoupのバージョンは以下のコマンドで確認できます。

pip list

またprintされないという事ですが、

python

1print(repr(name), repr(price))

としてみてください、何が表示されますか?

投稿2017/06/02 12:45

pashango2

総合スコア930

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

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

cir

2017/06/02 14:02

大変失礼しました。ターミナルとSublime Textを再起動したところ、無事商品名と値段を取得することができました。 1点質問をさせてください。 現在は、40件の情報が取得できているのですが、野菜の全商品の情報がほしい場合は、どのようにすれば良いでしょうか?何かヒントを頂ければ幸いです。
cir

2017/06/06 05:08

自動で行いたいと思い、やり方をお伺いしまいた。もう少し調べてみます。 お返事ありがとうございました。
pashango2

2017/06/06 05:37

クローリングでしたらScrapyというライブラリが一番有名かと思います。
cir

2017/06/08 01:51

Scrapyについて詳しく調べてみます。ありがとうございます!!
guest

0

ベストアンサー

CSSセレクタの指定方法に問題があるようです。

python

1for i in soup.select('ul > li.goodsitem'): 2 name = i.select_one('a.goodsname').text.strip() 3 price = i.select_one('p.goodsprice').text.strip() 4 print(name, price)

投稿2017/05/31 06:59

tell_k

総合スコア2120

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

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

cir

2017/06/02 07:02

回答ありがとうございます! 書いて頂いたソースコードで試したのですが、printされない状態です。もし、何かわかれば教えて頂きたいです。
cir

2017/06/02 13:53

大変失礼しました。ターミナルとSublime Textを再起動したところ、無事商品名と値段を取得することができました。助かりました、ありがとうございます。 重ね重ね申し訳ないのですが、2点質問があります。 ① ulタグではクラス名が必要なく、liタグではクラス名が必要な理由 ② textメソッドとget_textメソッドの違い 以上2点について教えていただけないでしょうか?
tell_k

2017/06/03 00:33

> ① ulタグではクラス名が必要なく、liタグではクラス名が必要な理由 ulタグで囲まれた 「li.goodsitem」の要素を取得したいので特に必要ないというだけです。極論を言えば、そのページにgoodsitemが一つしか存在しないなら「select('li.goodsitem')」でも良いです > ② textメソッドとget_textメソッドの違い あまり違いはよくわかってません。またtextはメソッドでなく、プロパティ(属性)です。多分 get_text のショートカット として 存在してるんだと思います。get_text は引数で挙動を変えられるのでその辺が欲しい場合はget_textを使うんじゃないでしょうか。
cir

2017/06/06 05:05

① ulタグではクラス名が必要なく、liタグではクラス名が必要な理由 ほしい要素が的確に指定されていれば、親要素の指定は自由なのですね。(ul.boxでも同じように取得できました) ② textメソッドとget_textメソッドの違い おっしゃる通り、textはプロパティでした。ドキュメントをみてみると、たしかにget_textに色々な引数を渡す例が書いてありました。 追加の質問まで丁寧に答えてくださり、ありがとうございました。大変勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問