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

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

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

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

Python

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

Q&A

解決済

1回答

3120閲覧

【Python】BeautifulSoupでのスクレイピングでタグがうまく取得できない。

退会済みユーザー

退会済みユーザー

総合スコア0

スクレイピング

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

Python

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

0グッド

1クリップ

投稿2018/03/31 13:59

編集2018/04/26 12:58

お世話になっています。以下困っていますどうぞよろしくお願いします。

前提・実現したいこと

Pythonを使ってWSJOnlineのページをスクレイピングし、
特定の単語で検索した結果の記事リストを取得したいです。
まず序盤の典型的な流れとして、requestsライブラリで対象ページのurlを指定し、BeautifulSoup(BS)で解析しようとしています。
ただ、BSを使用して記事リストのタグ(search-results-sector)を辿ってみたところエラーが出て困ってしまいました。エラーの内容を見るにリストの取得ができなかったようです。

以前青空文庫のページで同様のノリのコードを試したときはうまく行っています。違いとしてはWSJの方がサイトにJSが使われていたり少々リッチな感じなので、そこの関係なのかと思っています。(不勉強なものでそこらへんがよくわかっていません、すみません。。)

●検索結果ページ
https://www.wsj.com/search/term.html?KEYWORDS=apps%20digital

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

発生しているエラーメッセージは下記の通りです。

Traceback (most recent call last): File "/Users/userName/Desktop/01_ポータル/030_ITキャリア/031_VSCODE/0311_Python/180331_WSJOのコードその2/WSJOnlineのコード.py", line 42, in <module> wsjo.search_wsj('apps digital') File "/Users/userName/Desktop/01_ポータル/030_ITキャリア/031_VSCODE/0311_Python/180331_WSJOのコードその2/WSJOnlineのコード.py", line 35, in search_wsj ul = srs[0].select('div') IndexError: list index out of range

該当のソースコード

Python

1import requests, time, webbrowser 2from selenium import webdriver 3from bs4 import BeautifulSoup 4 5 6class WSJOnline: 7 def __init__(self, u, p): 8 self.url_top = 'https://www.wsj.com/asia' 9 self.url_sch = 'https://www.wsj.com/search/term.html?KEYWORDS=' 10 self.user = u 11 self.pw = p 12 13 def search_wsj(self, word): 14 # メソッド:単語を指定して検索する。 15 # https://www.wsj.com/search/term.html?KEYWORDS= に 16 # 検索ワードをくっつければ検索結果ページにいけるっぽい。 17 # この時、spaceは%20、"は%22。二語文は""でくくる。 18 19 sp_word = word.replace(' ', '%20') 20 ch_word = sp_word.replace('"', '%22') 21 target_url = self.url_sch + ch_word 22 23 response = requests.get(target_url) 24 response.encoding = response.apparent_encoding 25 26 bs = BeautifulSoup(response.text, 'html.parser') 27 28 srs = bs.select('div.search-results-sector') 29 ul = srs[0].select('div') 30 print(ul[0].text) #エラー概要の箇所 31 32 def list_get(self): 33 pass 34 35wsjo = WSJOnline('aaa', 'bbb') 36wsjo.search_wsj('apps digital')

試したこと

①''html.parser' を 'lxml'にして実行
→ IDLEの実行結果に「検索結果はありませんでした」と表示される。
→ ググってみましたがあんまりこの結果については記載なし、どういう意味なのか。タグがない?

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

Python 3.6.3
MacOS High Sierra 10.13.3

以上、よろしくお願いします。。

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

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

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

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

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

deadjupiter

2018/03/31 14:43

html.parserの代わりにlxml入れて使ったら?何故かwebdriver使ってるしそっちの方が良いかもしれないけど
退会済みユーザー

退会済みユーザー

2018/03/31 21:45

質問あざっす!!更新しました。webdriverはseleniumでもやってみたくてちょっと書いていたものの名残です。紛らわしくてスンマセン。コードから削除させていただきました。よろしくお願いします!!
guest

回答1

0

ベストアンサー

はじめまして、「検索結果がありませんでした」と表示されるのは、
実際に「検索結果がありませんでした」と表示されているため正常に取得できていると思います。

イメージ説明

また、html.parserの際にエラーになっている箇所はもう一つ上の行ですね。

ul = srs[0].select('div')

srs = bs.select('div.search-results-sector')で結果が取得できていないにも関わらず、indexの0を見ているため IndexError: list index out of range になっています。

pprintなどで取得結果をデバッグしてみてください。

投稿2018/04/12 01:16

Mt.Kinoko

総合スコア16

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

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

Mt.Kinoko

2018/04/12 01:22

後、気にならないのであれば問題ありませんが、エラーメッセージの中にお名前が拝見できます。xxxxxxxとかに置き換えてもいいかと思います。
退会済みユーザー

退会済みユーザー

2018/04/26 02:08

ありがとうございます! pprintってやつがあるんですね。調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問