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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Beautiful Soup

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

Python 3.x

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

Q&A

解決済

2回答

1289閲覧

Beautiful soup 文字列を抽出したら例外が発生する。

chaosVidar

総合スコア3

Beautiful Soup

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

Python 3.x

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

0グッド

0クリップ

投稿2020/11/01 22:04

環境: Windows10 python3 jupyternote
あるURLのページから複数のページにアクセスし、文字列を抽出しようとしているのですがあるページでエラーが発生してしまいます。
状況といたしまして

#ライブラリのインポート
from bs4 import BeautifulSoup
import urllib.request as req
from selenium import webdriver
import time
import pandas as pd
import requests

#URLの取得
url = 'https://yakkun.com/swsh/zukan/'
res = requests.get(url)
soup = BeautifulSoup(res.content, 'html.parser')
poke_table = soup.find('ul',class_='pokemon_list')

#リンクしたいURLリストの作成
links=[]
for aa in poke_table.find_all("a"):
link = aa.get("href")
pokeURLs = "https://yakkun.com" + link
links.append(pokeURLs)

#リンク先のポケモンの種族値計算
for poke_state in links:
html = req.urlopen(poke_state)
parse_html = BeautifulSoup(html,'html.parser')
aaa = parse_html.find(class_="table layout_right")
bbb = aaa.find_all(class_="c1")
for tr in aaa.find_all('tr'):
if '種族値' in tr.text:
title = tr.text
print(title)
hitpoint = tr.find_next_sibling()
attack = hitpoint.find_next_sibling()
defence = attack.find_next_sibling()
special_attack = defence.find_next_sibling()
special_defence = special_attack.find_next_sibling()
speed = special_defence.find_next_sibling()
average = speed.find_next_sibling()

print(hitpoint.text.split()) print(attack.text.split()) print(defence.text.split()) print(special_attack.text.split()) print(special_defence.text.split()) print(speed.text.split()) print(average.text.split())

で実行すると

◆ サルノリの種族値
['HP', '50']
['こうげき', '65']
['ぼうぎょ', '50']
['とくこう', '40']
['とくぼう', '40']
['すばやさ', '65']
['平均', '/', '合計', '51.7', '/', '310']
◆ バチンキーの種族値
['HP', '70']
['こうげき', '85']
['ぼうぎょ', '70']
['とくこう', '55']
['とくぼう', '60']
['すばやさ', '80']
['平均', '/', '合計', '70.0', '/', '420']
中略
◆ チェリムの種族値
['HP', '70']
['こうげき', '60']
['ぼうぎょ', '70']
['とくこう', '87']
['とくぼう', '78']
['すばやさ', '85']
['平均', '/', '合計', '75.0', '/', '450']
フラワーギフト天気が『にほんばれ』の時、ポジフォルムにフォルムチェンジする。種族値などは変わらないが、自分とすべての味方の『こうげき』『とくぼう』が1.5倍になる。

AttributeError Traceback (most recent call last)
<ipython-input-5-99deab9f3841> in <module>
13 special_attack = defence.find_next_sibling()
14 special_defence = special_attack.find_next_sibling()
---> 15 speed = special_defence.find_next_sibling()
16 average = speed.find_next_sibling()
17

AttributeError: 'NoneType' object has no attribute 'find_next_sibling'

このチェリムというポケモンのページでエラーが発生してしまいます。
ほかのページのソースと比較してみたのですが特に違いも判らない状況です。

どなたかわかる方がいれば、ご教授お願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ベースは私が書いたコードではありますが、判定方法の問題です。

if '種族値' in tr.text:と、ページ内に「種族値」という単語があった場合に
その単語がある要素を起点にコードが実行されていきます。
主なモンスターはページ内に「◆○○の種族値」と種族値の一覧の部分にタイトルがあります。
今回エラーが生じたモンスターの場合、ページ内の上記部分以外にも「種族値」という
単語が含まれる要素があった為そこからも解析を行おうとしてエラーが生じてしまっている様です。


解決方法
正規表現を使用して判定する

python

1import re 2 3 if re.match(r'^◆\s[ァ-ヴー]+の種族値$', tr.text): 4 title = tr.text

投稿2020/11/02 05:06

編集2020/11/02 05:46
nto

総合スコア1438

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

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

chaosVidar

2020/11/02 12:27

その節はありがとうございます。 ただ私の確認不足でしてスクレイピング行為が禁止されているためこの作業はこれにて打ち切りにいたします。
guest

0

speed = special_defence.find_next_sibling()

special_defenceがNoneとなっているため、find_next_siblingが存在しない、と言うエラーですね
まずはなぜそれがNoneになるのかを探っていきましょう

投稿2020/11/02 00:18

y_waiwai

総合スコア88042

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問