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

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

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

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

Q&A

解決済

1回答

317閲覧

Python のwebスクリプトについて

ChaCha_MaRu

総合スコア15

Python 3.x

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

0グッド

1クリップ

投稿2018/08/25 04:12

pythonのWebスクリプトのプログラムについてです。

https://yakkun.com/sm/zukan/n245
のサイトより140~145行目のそれぞれの値(HP:100,こうげき:75...)を摘出し、表示したいです。

<tr><td class="c1"><tr><td class="c1" style="width:125px;">HP</td><td class="left" colspan="5"><img src="//img.yakkun.com/bar.gif" style="width:60px;height:10px" />&nbsp;100</td></tr>こうげき</td><td class="left" colspan="5"><img src="//img.yakkun.com/bar.gif" style="width:45px;height:10px" />&nbsp;75</td></tr> <tr><td class="c1">ぼうぎょ</td><td class="left" colspan="5"><img src="//img.yakkun.com/bar.gif" style="width:69px;height:10px" />&nbsp;115</td></tr> <tr><td class="c1">とくこう</td><td class="left" colspan="5"><img src="//img.yakkun.com/bar.gif" style="width:54px;height:10px" />&nbsp;90</td></tr> <tr><td class="c1">とくぼう</td><td class="left" colspan="5"><img src="//img.yakkun.com/bar.gif" style="width:69px;height:10px" />&nbsp;115</td></tr> <tr><td class="c1">すばやさ</td><td class="left" colspan="5"><img src="//img.yakkun.com/bar.gif" style="width:51px;height:10px" />&nbsp;85</td></tr

下記が現在組んでいるプログラムです。しかし、一向に表示されません。変更すべき点はどこでしょうか。

import requests, bs4

suikun=""

res = requests.get('https://yakkun.com/sm/zukan/n245')
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, "html.parser")
elems = soup.select('td')

for tag in elems:
try:
#「span」要素から「style」をpopしていく。
string_ = tag.get("style").pop(0)
#摘出したstyleの文字列にnbspが設定されているかチェック。
if string_ in "nbsp":
#文字列を取得。
suikun = tag.string
#ループ処理を中断。
break
except:
#「span」要素から「style」をpopできなかった場合何もしない。
pass

print(suikun)

環境は windows7 anacondaのjupyterにて行っています。

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

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

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

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

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

hayataka2049

2018/08/25 16:59 編集

そのサイトの規約には「ロボットやツールを用いた自動収集はご遠慮ください」とあります。法的根拠が伴うかは微妙なところだと思いますが、ご留意ください。スクレイピングではよくこのようなケースがあるので、ご注意ください。https://yakkun.com/info/kiyaku.htm
guest

回答1

0

ベストアンサー

書いてみました。

Python

1import requests 2from bs4 import BeautifulSoup 3 4response = requests.get('https://yakkun.com/sm/zukan/n245') 5response.encoding = response.apparent_encoding 6 7soup = BeautifulSoup( 8 response.text, 'html.parser' 9) 10 11 12# 13# 14result = {} 15 16ret = soup.find('table', summary='詳細データ') 17for tr in ret.find_all('tr')[1:7]: 18 name, value = map(lambda tag: tag.text.strip(), tr.find_all('td')) 19 result[name] = int(value) 20 21print(result)

実行結果

{'HP': 100, 'こうげき': 75, 'ぼうぎょ': 115, 'とくこう': 90, 'とくぼう': 115, 'すばやさ': 85}

実行環境

  • Windows 10
  • Python 3.6.2
  • BeautifulSoup 4.6.0

元のコードは実はあまり読んでいませんが、ちょっと機械的に過ぎるように思います。
人が実際に読むように、まずテーブルを探すところから書くと自然だったのでは。
まあ、私のコードでもスライスで妥協しているところもありますが...

htmlコードを見てヒントを探りつつ、リファレンスを確認して適したアクセス方法を選びましょう。
ブラウザの開発者ツールを使って構造を覗くのも良いアイデアです。
Beautiful Soup 4.2.0 Doc. 日本語訳

あと、WebスクリプトじゃなくてWebスクレイピングです。

コードの書き方について

teratailには、上記のようにコードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
Python
特にPythonの場合、インデントが崩れるとコードの意味が変わってしまいます。

投稿2018/08/25 05:55

編集2018/08/25 06:00
LouiS0616

総合スコア35658

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

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

ChaCha_MaRu

2018/08/25 07:56

回答ありがとうございます。 また、その他の部分も丁寧にありがとうございます。 97行目の スイクン という部分も取りたいのですがどのようなコードになるでしょうか。
LouiS0616

2018/08/25 12:05

『基本データ』テーブルにあるデータを持ってくれば良いですね。
ChaCha_MaRu

2018/08/25 13:17

ree=soup.find("table",summary="基本データ") name=soup.find("tr") name=soup.title.string print(name.strip("|ポケモン図鑑ウルトラサンムーン|ポケモン徹底攻略")) というものを付け加えたのですが スイク というように最後の一文字だけ欠けてしまいます
LouiS0616

2018/08/25 13:38

stripの使い方を誤っているからです。 https://rcmdnk.com/blog/2016/05/09/computer-python/ また、せっかくテーブルを検索しているのですから、次のように書かないともったいないです。 ret = soup.find('table', summary='基本データ') name = ret.find('tr').text
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問