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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

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

Q&A

解決済

2回答

6251閲覧

for文を使ったスクレイピングの方法について

shunsuke1937

総合スコア48

Python 3.x

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

0グッド

0クリップ

投稿2018/08/22 07:42

編集2018/08/23 12:29

解決したいこと

ウェブスクレイピングをしたいと考えております。
例えば
https://www.aaa.***(***は1〜10まで変化するとします。)
というサイトがあるとします。
そこで、

https://www.aaa.1
上記のURLサイトの中には
表があり、
https://www.aaa.2
には、表が無いものとします。

URLの末尾変更させ1~10までのサイトを読み込み
tableのあるサイトのみを抜き出したいと思っております。

python

1from bs4 import BeautifulSoup 2import requests 3import pandas as pd 4from pandas import Series,DataFrame 5import time 6from itertools import product 7 8RN=[] 9data=range(1,11) 10for i in data: 11 time.sleep(3) 12 url = 'https://www.aaa.'+str(i) 13 result = requests.get(url) 14 c = result.content 15 soup = BeautifulSoup(c,'lxml') 16 summary = soup.find('div') 17 table = summary.find_all('table') if not 'table':#**(1)** 18 if summary is None: 19 continue 20 rows = table[0].find_all('tr')

(1)ここでtableがサイト中に無い時には、下記の処理を中止して次のステップに進むようにしたいです。

サイト内にtableが無い場合には下記のエラーが出てきます。
AttributeError: 'NoneType' object has no attribute 'find_all'

基本的な条件式の記述方法ですが、教えていただけますでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

for をご自身でもっと具体的に調べてほしいのですが、繰り返しの処理をスキップして次のステップに進むには continue を使います。

python

1if len(table) == 0: 2 continue

投稿2018/08/22 08:51

mather

総合スコア6753

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

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

0

table変数はTABLEタグが無い場合は[]かと思いますので以下の形で希望した動作になりますか?

python

1for i in Round: 2 time.sleep(3) 3 url = 'https://www.aaa.'+str(i) 4 result = requests.get(url) 5 c = result.content 6 soup = BeautifulSoup(c,'lxml') 7 summary = soup.find('div') 8 table = summary.find_all('table') 9 if not table: 10 continue 11 rows = table[0].find_all('tr')

投稿2018/08/22 08:14

denzow

総合スコア640

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

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

shunsuke1937

2018/08/22 08:22

ご回答ありがとうございます。 やはり先ほどと同じように下記のエラーが返ってきます。 AttributeError: 'NoneType' object has no attribute 'find_all' 他に考えられる要因はございますでしょうか?
mather

2018/08/22 08:54

エラーが発生している箇所の行番号をご自身で確認してどの行の `find_all` で発生しているか質問に書きましょう。 回答にある内容から察するに summary が None なのだと思います。
shunsuke1937

2018/08/22 09:04

ご回答いただいております、 table = summary.find_all('table') でエラーが出ております。
mather

2018/08/22 09:09

エラーを避けるだけなら if summary is None: continue とすればよろしいかと。目的(表が存在しない場合にスキップする)とはそもそも違う気がしますが。
shunsuke1937

2018/08/22 11:24

summary が存在しない時に次を実行する上記の例でも同じようにエラーが返ってきました。 他に考えられる、原因はありますでしょうか?
mather

2018/08/23 00:56

修正したソースコードを質問に追記(前の質問を消さずに最下部に追加)してください。書き方が間違っている可能性があります。
shunsuke1937

2018/08/23 12:29

ご回答いただきました内容を加筆しましたのでご確認をよろしくお願いいたします。
shunsuke1937

2018/08/23 12:35

同じようにサイト中にtableが無いからだとは思うのですが下記のエラーも出ます。 rows = table[0].find_all('tr')この行で IndexError: list index out of range というエラーです
mather

2018/08/23 15:34

Pythonの文法からキチンと考えてほしいし、summaryがNoneの場合のチェックをしたいはずなのにsummaryを使う方を先に書いてるし、諸々ミスしてます。 もうちょっと考えてみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問