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

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

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

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

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Beautiful Soup

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

Python

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

1回答

5019閲覧

Beautifulsoupでエラー'NoneType' object has no attribute 'text' がでます

XTJP

総合スコア11

スクレイピング

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

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Beautiful Soup

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

Python

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2020/11/16 12:39

編集2020/11/16 12:40

前提・実現したいこと

書籍名から出版社名を得て、Googleスプレッドシートにまとめたいです。Colabで作業しています。
https://teratail.com/questions/304423で同じことを国会図書館のAPIを使用して実現しようとしましたが、難儀しているためスクレイピングによる解決を目指したいと思います。

https://qiita.com/Azunyan1111/items/b161b998790b1db2ff7aを参考に、大幅に引用しています。

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

https://honto.jp/netstore/search.html?gnrcd=1&k=%E3%82%A8%E3%83%BC%E3%82%B9%E8%96%AC%E7%90%86%E5%AD%A6&extSiteId=junkudo&cid=eu_hb_jtoh_0411&srchf=1 --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-35-9e745ffb8004> in <module>() 35 36 # CSSセレクターを使って指定した場所のtextを表示します ---> 37 print(soup.select_one("#displayOrder1 > div > div.stInfo > div.stContents > ul > li:nth-child(4) > a").text) 38 publisher = soup.select_one("#displayOrder1 > div > div.stInfo > div.stContents > ul > li:nth-child(4) > a").text 39 #sheetに反映 AttributeError: 'NoneType' object has no attribute 'text'

該当のソースコード

Python

1import numpy as np 2from pandas import DataFrame 3import xml.etree.ElementTree as ET 4import requests 5from collections import defaultdict 6from google.colab import files 7import urllib.request 8from bs4 import BeautifulSoup 9 10ss_url = "https://docs.google.com/spreadsheets/d/ooooooo" 11workbook = gc.open_by_url(ss_url) 12worksheet = workbook.get_worksheet(1) 13 14cell_list = worksheet.range("A3:A5") 15for cell in cell_list: 16 17 # 検索条件 18 title = cell.value 19 20 # 検索用語を変換 21 search_word = urllib.parse.quote(title) 22 # アクセスするURL 23 url = "https://honto.jp/netstore/search.html?gnrcd=1&k=" + search_word + "&extSiteId=junkudo&cid=eu_hb_jtoh_0411&srchf=1" 24 print(url) 25 # URLにアクセスする 戻り値にはアクセスした結果やHTMLなどが入ったinstanceが帰ってきます 26 instance = urllib.request.urlopen(url) 27 28 # instanceからHTMLを取り出して、BeautifulSoupで扱えるようにパースします 29 soup = BeautifulSoup(instance, "html.parser") 30 31 # CSSセレクターを使って指定した場所のtextを表示します 32 print(soup.select_one("#displayOrder1 > div > div.stInfo > div.stContents > ul > li:nth-child(4) > a").text) 33 publisher = soup.select_one("#displayOrder1 > div > div.stInfo > div.stContents > ul > li:nth-child(4) > a").text 34 #sheetに反映 35 worksheet.update_cell(cell.row, cell.col +1, publisher)

試したこと

print(soup.select_one("#displayOrder1 > div > div.stInfo > div.stContents > ul > li:nth-child(4) > a").text)

print(soup.select_one("#displayOrder1 > div > div.stInfo > div.stContents > ul > li:nth-child(4) > a").string)
にしましたが特に変わりません。

https://qiita.com/booleanoid/items/211820516eb7a2191b32
を調べましたが、どうも別の問題かもしれません。

Seleniumを使う方法も模索中ですが、解決につながるかはわかりません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

soup.select_one(~~~)の結果がNoneということです。
つまり、指定したノードは存在しません。

print(urllib.request.urlopen(url).read())して、HTMLをよく見直しましょう。

ブラウザの開発者ツールなどで見たものを元にコードを書いたとすると、
・JavaScriptで動的に追加されたノードである
・フレームの中のノードである
などが、過去の質問によくあった例です。

投稿2020/11/16 12:52

otn

総合スコア85901

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

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

XTJP

2020/11/16 12:58

ご回答ありがとうございます。早速、 `print(urllib.request.urlopen(url).read())`を実行し、長い出力が得られました。おそらくこれがHTMLなのでしょうか。 Chromeの開発者ツールでセレクターをコピーしたものを元にコードを書いています。 ・JavaScriptで動的に追加されたノードである ・フレームの中のノードである 不勉強のため、上の意味するところがあまりわからないので明日調べてみます。
otn

2020/11/16 13:07

「ウェブアプリの基本」みたいな入門書でまず入門すると良いかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問