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

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

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

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

XPath(XML Path)

XML Path Language (XPath; XMLパス言語)は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文の事をいいます。XPathはXMLとは別の構文を使用します。XMLドキュメントの抽象、論理ストラクチャ上で動作します。

Python

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

Q&A

解決済

1回答

540閲覧

python3 xpathを使用したデータ取得について

moon_sun

総合スコア7

スクレイピング

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

XPath(XML Path)

XML Path Language (XPath; XMLパス言語)は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文の事をいいます。XPathはXMLとは別の構文を使用します。XMLドキュメントの抽象、論理ストラクチャ上で動作します。

Python

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

0グッド

1クリップ

投稿2019/08/25 11:02

編集2019/08/25 22:05

前提・実現したいこと

python3でxpathを使用してデータの取得をしたいです。
複数のデータを取得するため、for文内でxpathの数値を変更していますが、
途中でデータを取得できなくなりました。
どこがおかしいのかわからなかったので質問させていただきます。

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

Traceback (most recent call last):
File "<stdin>", line 15, in <module>
IndexError: list index out of range

該当のソースコード

import csv import time import requests import lxml.html output = ["日付","始値","高値","安値","終値"] c = "2764" year = ["2010","2011","2012","2013","2014","2015","2016","2017","2018","2019"] variable_1 = ["1","2","3","4","5"] with open('no.csv',encoding='sjis', newline='') as f: data = csv.reader(f) for row in data: variable_2 = row for y in year: url = "https://kabuoji3.com/stock/"+c+"/"+y+"/" r = requests.get(url) html = r.text root = lxml.html.fromstring(html) for v_2 in variable_2: if len(output) != 0: with open('data_10.csv','a',newline="") as f: writer = csv.writer(f) writer.writerow(output) output = [] for v_1 in variable_1: path_no = "//*[@id='base_box']/div/div[4]/div/div/div/table/tbody["+v_2+"]/tr/td["+v_1+"]" s_data = root.xpath(path_no) data_t = s_data[0].text print(data_t) output.append(data_t) time.sleep(1) コード

試したこと

xpathを手動で入力してもv_2の部分を2にするとs_dataに何も入りませんでした。
v_2が1の間(v_1が1~5まで1周する間)は問題なくデータを取得できました。

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

python3.7.4

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

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

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

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

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

y_waiwai

2019/08/25 11:10

このままではコードが見れないので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください
meg_

2019/08/25 11:11

コードは「コードの挿入」で記入してください。
moon_sun

2019/08/25 21:32

<code>ボタンからコードを貼りつけ直しました。 初めて使うため、使い方が分かっておらず申し訳ありませんでした。
guest

回答1

0

ベストアンサー

「デバッグしてください等の丸投げの質問は推奨していないのですが?」と思いながら見ていましたが回答します。
tbody[2]が使えなかったのでtr[2]に変更してみました。

diff

1- path_no = "//*[@id='base_box']/div/div[4]/div/div/div/table/tbody["+v_2+"]/tr/td["+v_1+"]" 2+ path_no = "//*[@id='base_box']/div/div[4]/div/div/div/table//tr["+v_2+"]/td["+v_1+"]"

データ取得元における<tbody>が間違っているのが原因のようです。

html

1<tbody> 2 <tr> 3 <td>2019-01-04</td> 4 <td>333</td> 5 <td>340</td> 6 <td>323</td> 7 <td>336</td> 8 <td>171600</td> 9 <td>336</td> 10 </tr> 11</tbody> 12 <tr> 13 <td>2019-01-07</td> 14 <td>349</td> 15 <td>360</td> 16 <td>347</td> 17 <td>360</td> 18 <td>188000</td> 19 <td>360</td> 20 </tr> 21</tbody>

投稿2019/08/25 22:51

querykuma

総合スコア777

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

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

moon_sun

2019/08/26 15:05

回答ありがとうございました。 どのような内容を質問して良いか確認せずに投稿してしまい、申し訳ございませんでした。 ご教授いただいた内容でデータ取得できました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問