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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

XPath(XML Path)

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

Q&A

解決済

1回答

3137閲覧

ウェブスクレイピングで結果がNaNと出力される

shigahi

総合スコア21

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

XPath(XML Path)

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

0グッド

0クリップ

投稿2016/11/09 07:01

編集2016/11/11 05:43

#実現したいこと
nokogiriを使って数値を抽出しようとしているのですが実行するとNaNとだけ出力されてしまいます。Webページは血圧計の結果を送ると表に記録されます。13日の値を取り出そうとしています
###該当のソースコード

ruby

1#!/usr/bin/ruby 2require 'mechanize' 3agent = Mechanize.new 4agent.user_agent_alias = 'Windows Mozilla' 5url = 'https://www.watashi-move.jp/wl/mydata/sphygmomanometer.php?targetDate=2016/07/01' 6page = agent.get(url) 7mypage = page.form_with(id: 'form1') do |form| 8form.loginid = '*' 9form.password = '*' 10end.submit 11 12require 'nokogiri' 13require 'open-uri' 14url = 'https://www.watashi-move.jp/wl/mydata/sphygmomanometer.php?targetDate=2016/07/01' 15user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36' 16charset = nil 17html = open(url, "User-Agent" => user_agent) do |f| 18charset = f.charset 19f.read 20doc = Nokogiri::HTML.parse(html, nil, charset) 21doc.xpath('//tr[@class="day13"]/td[@class="pressureMin"]').text 22puts doc.xpath('//tr[@class="day13"]/td[@class="pressureMin"]').text 23end

###試したこと
Xpathの部分をdoc.xpath('//*[@class="datas"]/table[@class="datalist"]/tr[@id=listTr13]/td[@class="pressureMin"]/span')など試しましたがだめでした
###HTML
文字数の関係で13日以外削りました

w3.org/TR/xhtml1/DTD/xhtml1

1<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><meta http-equiv="Content-Style-Type" content="text/css" /><meta http-equiv="Content-Script-Type" content="text/javascript" /><meta name="robots" content="noindex,nofollow" /> 4<title>閲覧</title> 5<link rel="shortcut icon" href="/wl/images/common/favicon.ico" type="image/x-icon" /><link rel="stylesheet" type="text/css" href="/wl/css/common/reset_1610261.css" /><link rel="stylesheet" type="text/css" href="/wl/css/common/base_1610261.css" /><link rel="stylesheet" type="text/css" href="/wl/css/jcal_1610261.css" /><link rel="stylesheet" type="text/css" href="/wl/css/mydata_edit_common_1610261.css" /><link rel="stylesheet" type="text/css" href="/wl/css/mydata_sphygmomanometer_1610261.css" /><link rel="stylesheet" type="text/css" href="/wl/css/mydata_edit_ec_1610261.css" /> 6<script type="text/javascript" src="/wl/js/common/jquery-1.4.2.min.js" charset="utf-8"></script> 7<script type="text/javascript" src="/wl/js/common/base_1610261.js" charset="utf-8"></script><script type="text/javascript" src="/wl/js/common/action_1610261.js" charset="utf-8"></script><script type="text/javascript" src="/wl/js/jcal_1610261.js" charset="utf-8"></script><script type="text/javascript" src="/wl/js/mydata_edit_cmn_1610261.js" charset="utf-8"></script><script type="text/javascript" src="/wl/js/config/pc_msg_ja_1610261.js" charset="utf-8"></script><script type="text/javascript" src="/wl/js/config/pc_mydata_label_ja_1610261.js" charset="utf-8"></script> 8//<![CDATA[ 9var cookieOptions = {}; 10cookieOptions.expires = 9999;cookieOptions.path = "/";cookieOptions.domain = document.domain; 11if ($.cookie("isBroadFont") == '1'){ 12$("head").append('<link rel="stylesheet" href="/member/css/common/meiryo_1610261.css" type="text/css" /> '); 13} else if($.cookie("isBroadFont") == '2'){ 14$("head").append('<link rel="stylesheet" href="/member/css/common/hirakaku_1610261.css" type="text/css" /> ');} 15jQuery(function(){ 16var d = new Detector(); 17if (d.test('メイリオ')){$("head").append('<link rel="stylesheet" href="/member/css/common/meiryo_1610261.css" type="text/css" /> '); 18$.cookie("isBroadFont", '1', cookieOptions);} else if (d.test('HiraKakuPro-W3')){$("head").append('<link rel="stylesheet" href="/member/css/common/hirakaku_1610261.css" type="text/css" /> ');$.cookie("isBroadFont", '2', cookieOptions);}}); 19//]]> 20</script> 21<script type="text/javascript" charset="utf-8"> 22//<![CDATA[ var _gaq = _gaq || []; 23 _gaq.push(['_setAccount', 'UA-37292219-1']); 24 _gaq.push(['_setDomainName', 'www.watashi-move.jp']); 25 _gaq.push(['_trackPageview']); 26(function() {var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; 27var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);})(); 28//]]> 29</script></head> 30<body> 31<!-- header area start --> 32<div id="headerArea"><div id="headerTop"> 33<h1><a name="home" href="https://www.watashi-move.jp/wl/home/index.php"><img src="/wl/images/common/logo_wellnesslink_0001.gif" alt="WellnessLINK" width="190" height="24" /></a></h1> 34<ul><li class="noPipe"><a href="https://www.watashi-move.jp/member/profile/index.php" title="WM会員情報">WM会員情報</a></li><li ><a href="https://www.watashi-move.jp/member/support/index.php" title="サポート">サポート</a></li><li ><a href="http://www.watashi-move.jp/member/logout.php" title="ログアウト">ログアウト</a></li><li id="wmLogo" ><ahref="https://www.watashi-move.jp/member/home/index.php"><img src="/wl/images/common/logo_wm_0001.gif" alt="私ムーブ" width="58" height="24" /></a></li></ul></div> 35<div id="globalNav"> 36<p id="statusUser"><a href="https://www.watashi-move.jp/member/profile/index.php" name="globalNavi">*さん</a></p> 37<ul><li><a href="https://www.watashi-move.jp/wl/home/index.php" name="globalNavi"><img src="/wl/images/common/globalnav_home_0001.gif" alt="ホーム" width="110" height="40" class="rollover" /></a></li><li><a href="https://www.watashi-move.jp/wl/mygraph/index.php" name="globalNavi"><img src="/wl/images/common/globalnav_graph_0001.gif" alt="グラフ" width="130" height="40" class="rollover" /></a></li></ul></div></div> 38<!-- header area end --><!-- container area start --> 39<div id="contentArea"> 40<!-- main area start --> 41<div id="content"><div id="contentWide"> 42<form id="vitalForm" name="sphygmomanometerform" method="post" action=""> 43<div class="navi clear"> 44<h2><img src="/wl/images/common/icon_measurementdata_0001.gif" alt="" width="41" height="41" class="icon" /><img src="/wl/images/h2_datalist_0001.gif" alt="メモ" width="114" height="18" /></h2> 45<ul><li class="link"><div class="addLink"><p><img height="11" width="13" src="/wl/images/common/arrow2_0001.gif" alt=""> <a href="http://www.watashi-move.jp/pc/wm/help_m/index.html#58" class="subWindowOpen">ヘルプ</a></p></div></li></ul> 46<ul><li><a class="backButton" href="sphygmomanometer.php?targetDate=2016/06/01"><img src="/wl/images/common/btn_date_back_0001.gif" alt="戻る" width="81" height="34" class="rollover" /></a></li><li id="date1" class="date">2016/07</li><li><a class="nextButton" href="sphygmomanometer.php?targetDate=2016/08/01"><img src="/wl/images/common/btn_date_next_0001.gif" alt="進む" width="81" height="34" class="rollover" /></a></li><li class="space">&nbsp;</li><li class="space cancel">&nbsp;</li><li class="space save"><a id="toEditMode" class="buttonLink" href="sphygmomanometer.php?editMode=editMode&amp;line=1&amp;targetDate=2016/07/01"><img src="/wl/images/common/btn_edit_0002.gif" alt="編集" width="142" height="34" class="rollover" /></a></li></ul></div> 47<div class="notifyMessageArea clear"><div class="notifyMessage"><p> 48&nbsp;</p></div> 49<div class="adv"><p>&nbsp;</p></div></div> 50<ul class="tab clear"><li class="stay"><strong>血圧計</strong></li> 51<li><a class="tabLink" href="memo.php?targetDate=2016/07/01">メモ<a></li></ul> 52<div class="box01Rounded clear"><div class="attention"><div class="hint"><span class="aten">※</span>入力必須</div> 53<div class="links"><a href="http://www.watashi-move.jp/wl/mydata/csv.php?c=2&targetDate=2016/07/01" style="margin-left:5px">出力</a> 54<a href="http://www.watashi-move.jp/wl/mydata/csv_all.php?c=2" onclick="return confirmSubmit();" style="margin-left:5px">出力</a> 55<a href="http://www.watashi-move.jp/wl/mydata/MyData_HEM_201607.pdf?time=1478700665" target="_blank" style="margin-left:5px">印刷</a></div></div> 56<div style="display:none;"><div style="display:none;" id="dummyArea"></div></div> 57<div class="header"><table><tr class="headerLine1"> 58<th colspan="4" rowspan="2" class="date">2016年7月</th> 59<th rowspan="2" class="time"><div class="glossary">時刻<span class="aten">※</span></th> 60<th colspan="3" class="bloodPressure">血圧<span class="aten">※</span><em> (mmHg)</em></th><th rowspan="2" class="pulse">脈拍<br /> 61<em> (拍/分)</em></th><th colspan="2" class="takingMedicine">服薬</th><th rowspan="2" class="bpmemo">手帳<em></em></th><th rowspan="2" class="delete">削除</th><th rowspan="2" class="forScrollBar">&nbsp;</th></tr> 62<tr class="headerLine2"><th class="pressureMax">最高血圧</th><th class="pressureSplit">/</th><th class="pressureMin">最低血圧</th><th class="takeMedicine">飲んだ</th><th class="notTakeMedicine">飲まな<br />かった</th></tr></table></div> 63<div class="datas" > 64<table id="sphygmomanometertable" class="datalist"> 65<tr id="listTr13" class="day13"> 66<td class="day">13</td> 67<td class="week">水</td> 68<td class="memo">&nbsp;</td> 69<td class="btnAdd"></td> 70<td class="time">13:44</td> 71<td class="pressureMax"><span>93</span></td> 72<td class="pressureSplit">/</td> 73<td class="pressureMin"><span>59</span></td> 74<td class="pulse_rate"><span>77</span></td> 75<td class="takeMedicine"><input type="radio" name="take_medicine[13]" id="radio13-1" value="1" readonly="readonly" disabled="disabled" /></td> 76<td class="notTakeMedicine"><input type="radio" name="take_medicine[13]" id="radio13-2" value="2" readonly="readonly" disabled="disabled" /></td> 77<td class="bpmemo"></td> 78<td class="btnDelete">&nbsp;<input type="hidden" id="day13" name="day[13]" value="13" /><input type="hidden" class="auto_flg" id="auto_flg13" name="auto_flg[13]" value="1" /><input type="hidden" id="day_group13" name="day_group[13]" value="13" /><input type="hidden" name="measure_start[13]" value="" /></td></tr> 79</table></div> 80</body> 81</html>

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

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

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

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

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

otn

2016/11/09 07:09

HTMLと合ってないと言うことでしょう。HTMLを見ないことには何とも言い難いですね。
akio221

2016/11/09 08:29

当該「>Webページはオムロンのウェルネスリンク」を開き、ブラウザ上の右クリックからソース表示したタグの構成が分かれば、doc.xpathの分解と一致しているか判別できます。
shigahi

2016/11/09 16:02

HTMLを記載したいのですが、文字数制限で10000字を超えていないのに規制がかかって投稿できないのでもう少し待っていただけますか?申し訳ありません。
otn

2016/11/10 00:16

練習として、もっと簡単なサイトでのスクレイピングから始めてはどうでしょうか。
shigahi

2016/11/10 05:57

学校の研究でいろいろやっていて、このサイトを使っていてのですが、初心者には向いてないですね。。。htmlの投稿ができたのでみていただけたら嬉しいです…13日以外のデータは構造は同じなので文字数の関係で省略しました。よろしくお願い致します。
guest

回答1

0

ベストアンサー

Ruby

1doc.xpath('//tr[@id="listTr13"]/td[@class="pressureMin"]').text

で良いかと。

そもそも書かれているxpathの3文字目の*ってどういう意味ですかね?

#追記

ログイン後のページの遷移の書き方がいまいち理解できていなくて

リンクをclickしたり、フォームをsubmitしたり、url指定でagent.getしたりするとページ遷移します。
テストしてませんが、こんな感じで。

Ruby

1#!/usr/bin/ruby 2require 'mechanize' 3agent = Mechanize.new 4agent.user_agent_alias = 'Windows Mozilla' 5 6url = 'https://www.watashi-move.jp/wl/mydata/sphygmomanometer.php?targetDate=2016/07/01' 7page = agent.get(url) 8mypage = page.form_with(id: 'form1') do |form| 9form.loginid = '*' 10form.password = '*' 11end.submit 12 13url = 'https://www.watashi-move.jp/wl/mydata/sphygmomanometer.php?targetDate=2016/07/01' 14page = agent.get(url) 15doc = page.root 16doc.xpath('//tr[@class="day13"]/td[@class="pressureMin"]').text 17puts doc.xpath('//tr[@class="day13"]/td[@class="pressureMin"]').text 18end

投稿2016/11/10 06:12

編集2016/11/11 08:18
otn

総合スコア84555

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

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

shigahi

2016/11/10 06:46

回答ありがとうございます。 早速試してみたのですが何も出力されませんでした。 色んなサイトなどを参考にしたのですが、よく分かっていませんでした。 すみません。 ありがとうございました。
otn

2016/11/10 06:57

> 早速試してみたのですが何も出力されませんでした。 コードを全部載せてください。
otn

2016/11/11 05:49

提示されているHTMLは、 > html = open(url, "User-Agent" => user_agent) do |f| で取得した物に間違いないですか?「ブラウザで見た物です」みたいなボケはないでしょうか。
otn

2016/11/11 05:51

Mechanizeでログインしたのを放って置いて、open-uriで取得してますが、ログイン情報は引き継がれない気がします。そのあたり大丈夫ですか?
shigahi

2016/11/11 06:17

ご指摘ありがとうございます。引継ぎについて調べてみたのですが、 ログイン後のページの遷移の書き方がいまいち理解できていなくて よろしければ教えて下さい。勉強不足で本当に申し訳ありません。
shigahi

2016/11/13 05:02

回答ありがとうございます! 試したのですが、エラーが出てしまいました。 少し試行錯誤してみて分からなかったらまた質問し直します。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問