• 締切済み

Mechanizeでgetしたpageの文字コード変換

Mecahnizeを使ってgetしたPageのbodyに対して、 文字コード変換したところ、Pageの内容がほとんど消えてしまいます。 よって、タグのサーチやフォームの操作などで失敗してしまいます。 変換前にlinksメソッドを使うと現象が回避されるのを 発見しましたが理由がわかりません。 コードは以下のような感じです。 agent = WWW::Mechanize.new page = agent.get(url) p page #=>いろいろ表示される WWW::Mechanize::Page #lnks = page.links #=>これがないとpageの内容がおかしくなる #変数lnksは全く使っていない page.body = page.body.toutf8 # UTF8に変換 p page #=> 1回目と比較して内容がほとんどなくなっている #linksメソッドを使えば現象が起きない rubyは1.8.7 p174 i386-mswin32です。 mechanizeは0.9.3です。 nokogiriは1.4.1, 1.3.3です。 理由がわかる方、スマートな回避方法、 このコードで使い続けても問題ないか?など ご教授ください<(_ _)>

  • Ruby
  • 回答数1
  • ありがとう数11

みんなの回答

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

linksメソッドで直るというのがわかりませんが、もし、 ・文字コードがUTF-8でなく、EUC-JP,Shift_JIS,ISO-2022-JPである ・にもかかわらずJIS規格にない丸付き数字とかローマ数字などを使っている ということであれば、文字コードの問題で、回避策があります。

ayudaia
質問者

お礼

Mechanizeの研究に時間がかかりすぎてしまいました。 ご回答ありがとうございました。

ayudaia
質問者

補足

MechanizeからWWW::がなくなりましたね。。。 それはさておき、 数ヶ月にわたる研究の結果、 @post_connect_hookにコード変換のProcオブジェクトを登録することで解決するようです。

関連するQ&A

  • WWW::Mechanizeの文字コードについて質問

    WWW::Mechanizeの文字コードについて質問 以下のようなソースコードを書いて実行してみたのですが どのサイトを取得しても、すべて文字コードがUTF8だと認識されます。 ------------------------------------------------------- #!/usr/bin/perl #WWW:MechanizeでHTMLの取得 use WWW::Mechanize; $w = WWW::Mechanize->new(); $w->get("URL"); $html=$w->content; #文字コードの判別 use Encode; use Encode::Guess qw/ascii utf8 euc-jp shiftjis 7bit-jis/; my $dec = Encode::Guess->guess($html); print$dec->name; ------------------------------------------------------- 例えば以下のサイトは文字コードがEUC-JPですがこれもprintされるのはUTF8となってしまいます。 http://barukanlog.blog31.fc2.com/blog-entry-541.html WWW:Mechanizeでサイトを取得し、サイトの文字コードを調べてすべてsjisにする ということがしたいのですが、すべてutf8に判断されて先へ進めないんです。 何か設定やメソッドを追加しなくてはいけないのでしょうか? わかりにくい質問かとは思いますがご回答お願いします。

  • PerlのWWW**Mechanizeのオブジェクトから中身を取り出す

    PerlのWWW**Mechanizeのオブジェクトから中身を取り出す方法。 WWW:Mechanaizeでリンクの一覧を取得しようと思い 以下のようなコードを書きましたが、リンク一覧がWWW::Mechanize::Linkオブジェクトで取得されます。 解説文を読んでもここからどうやってテキストのアドレスを取得すればいいか分からないです。 何かメソッドを実行すればよいのでしょうか? わかりにくい質問かと思いますがご回答お願いします。 ……………………………………………………………………………… #WWW:Mechanizeの読み込み use WWW::Mechanize; #サイトの取得 $w = WWW::Mechanize->new(autocheck => 0); $w->get("URLが入ります。"); @link_list=$w->links; foreach ${_} (@link_list){print"${_}\n";}     ↓ WWW::Mechanize::Link=ARRAY(0x243c564) WWW::Mechanize::Link=ARRAY(0x243c564) とオブジェクトで返されてしまう。 ………………………………………………………………………………

    • ベストアンサー
    • Perl
  • RubyによるMechanizeを利用したformの取得について

    kamuycikapです。 <環境> OS : Windows7 Ruby: ActiveScriptRuby     ruby 1.8.7 (2009-06-12 patchlevel 174) [i386-mswin32] <やりたいこと> 手順1.ログインページにアクセスし、ログインIDとパスワードを入力し、ログインボタンをクリックする。 手順2.手順1から遷移したページに設置されている「CSVダウンロード」ボタンをクリックしてCSVファイルを取得する <ソースコード> ---ここから require 'rubygems' require 'mechanize' require 'kconv' agent = WWW::Mechanize.new page = agent.get('https://www.superdelivery.com/common/auth/login') login_form = page.forms.first login_form.fields[0].value = "hogehoge"  # ログインID入力 login_form.fields[1].value = "foobar"   # パスワード入力 redirect_page = agent.submit(login_form) ---ここまで 上記プログラムを実行すると下記のエラーが発生します。 undefined method `fields' for nil:NilClass (NoMethodError) pメソッドを利用してpageを画面に表示してみた処、以下の様子です。 ---ここから #<WWW::Mechanize::Page {url #<URI::HTTPS:0x467dba4 URL:https://www.superdelivery.com/common/auth/login>} {meta} {title "\343\202\242\343\203\221\343\203\254\343\203\253\343\203\273\351\233\221\350\ 262\250\343\202\222\345\215\270\350\262\251\345\243\262-\343\202\271\343\203\274 \343\203\221\343\203\274\343\203\207\343\203\252\343\203\220\343\203\252\343\203 \274"} {iframes} {frames} {links #<WWW::Mechanize::Page::Link "" nil> #<WWW::Mechanize::Page::Link "\347\271\247\357\275\271\347\271\235\357\275\274\347\271\235\344\273\243" "http://www.superdelivery.com/">} {forms}> ---ここまで どうも、formを引っ張ってこれてない模様です。 name属性が設定されていれば問題無いのかもしれないのですが、name属性もありません。 結果として、ログインを行うことすら出来ておりません。 formの内部にあるテキスト領域等にアクセスするためのメソッドはformクラスのFieldにぶら下がっている様子ですので、formが取得できてなければ利用できないのではないかと想像しています。 参考にしたサイトは下記のとおりです。 http://mechanize.rubyforge.org/mechanize/WWW/Mechanize/Form/MultiSelectList.html http://d.hatena.ne.jp/kitamomonga/20090307/ruby_mwchanize_0_9_2_out WIN32OLEを使って、IEを自動操縦する事も検討したのですが、出来るならMechanizeを利用してスマートに処理を実行したいです。 上記のコードは私が利用しているサイトのログインページですが、ログインを利用するページでname属性の無いformを利用しているページであれば何処でも一緒なのではないかと思います。 解決策についてご教示願います。

    • ベストアンサー
    • Ruby
  • ruby mechanize アクセス出来ない

    https://login.ocn.ne.jp/auth/s2016/pc/AuthLoginDisplay.action このサイトにRubyのmechanizeからログインしたいのですが、 そもそもここにアクセスできていないようです。 .actionというのはhtmlと違ってアクセスできないのでしょうか。 以下、コードと出力です。 # -*- encoding: utf-8 -*- require 'rubygems' require 'mechanize' agent = Mechanize.new page = agent.get('https://login.ocn.ne.jp/auth/s2016/pc/AuthLoginDisplay.action') pp page 出力 #<Mechanize::Page {url #<URI::HTTPS:0x007f989240a150 URL:https://login.ocn.ne.jp/auth/s2016/pc/AuthLoginDisplay.action>} {meta_refresh} {title "システムエラー"} {iframes} {frames} {links #<Mechanize::Page::Link "ヘルプ" "http://www.ocn.ne.jp/login/mb/index.html"> #<Mechanize::Page::Link "著作権について" "http://mobile.ntt.com/m/copyright.html"> #<Mechanize::Page::Link "プライバシーポリシー" "http://506506.ntt.com/mbl/privacy/s_policy01.html"> #<Mechanize::Page::Link "→OCNトップ" "http://www.ocn.ne.jp"> #<Mechanize::Page::Link "NTT Communications" "http://www.ntt.com/"> #<Mechanize::Page::Link "著作権について" "http://www.ntt.com/COPYRIGHT/"> #<Mechanize::Page::Link "プライバシーポリシー" "http://www.ocn.ne.jp/privacy-policy/"> #<Mechanize::Page::Link "NTTコミュニケーションズ" "http://www.ntt.com/">} {forms}> 以上

    • ベストアンサー
    • Ruby
  • Perl WWW::Mechanize

    恐れ入ります。WWW::Mechanizeを使って下記のサイトにアクセスしようとしても開くことが出来ません。業務上自動化したい部分があるのですが、画面が開かず、ロード中のままで開かない状態です。その他のサイトでは開くことが可能です。よろしくお願いいたします。 $url[0] = "https://salonboard.com/"; ← 開かない $url[1] = "https://www.google.com"; ← 開く my $mech = WWW::Mechanize->new( agent=>"Mozilla/5.0 (Windows NT 10.0; Win64; x64) " ); my $response = $mech->get( $url[0] ); print "Content-type: text/html;\n\n"; print $mech->content;

    • ベストアンサー
    • Perl
  • WWW::Mechanizeを使っておられる方、又は使える方に質問です。

    WWW::Mechanizeを使っている方、使える方にお聞きしたいです。 下記のような適当なURLを読みこんでそのリンクを辿るコードを書きました。 リンクが見つからなかった場合のチェックが正常に働くかの確認ため、 15行目でわざと存在しないlinkを指定してみました。 16行目で止まって欲しいのですが、止まりません。最終行の様にすると止まります。 この振舞いは私だけでしょうか? もしお手持ちの環境でMechanizeが使える方、試せる方がおられましたら 結果を教えて頂けたら幸です。 1つ気になっているのは、installのmeke testの段階で、 以下に関しエラーが出てはおりました。 t/live/follow.t t/live/follow_link.t t/live/get.t t/local/back.t 私の環境は RHL9, perl, v5.8.0 gcc 3.2.2 です。 #!/usr/bin/perl -w use strict; use WWW::Mechanize; use LWP 5.803; my $url="http://www.yahoo.co.jp"; my $mec=WWW::Mechanize->new(); my $response=$mec->get($url); $mec->success() or die $mec->res->status_line(); # $urlが存在しない場合はここで止まって欲しいし実際とまることを確認。 my $a=$mec->follow_link(url_regex => qr/bad_html$/); #存在しないリンクを指定 $mec->success() or die $mec->res->status_line(); #ここで止まることを期待するが止まらない。 #$a or die "Failed to find links\n"; #こうすれば止まる。

    • ベストアンサー
    • Perl
  • Rubyのmechanizeを利用したファイルダウンロードの自動化について

    初めて質問します。よろしくお願いいたします。 Rubyのmechanizeを利用し、form内のダウンロードボタンを クリックして、ファイルをダウンロードする処理を記載したい のですが、ファイルをローカルマシンに保存する方法がわかりません。 ご存知の方がいらっしゃいましたら、ご教授頂ければと思います。 よろしくお願いいたします。 ↓↓↓以下、コードです。↓↓↓ require 'rubygems' require 'mechanize' require 'kconv' #初期設定 fname = 'test.csv' csv_file = File.open(fname,'w') # インスタンス生成 agent = WWW::Mechanize.new # User-Agentの設定 agent.user_agent_alias = 'Windows IE 6' # ページ取得 site_login = agent.get('https://***.php') # フォームを探す search_form = site_login.forms.with.name('login').first # テキストボックスにデータを入力 search_form['f[EMAIL]'] = 'userid' search_form['f[PASSWORD]'] = 'password' # フォームのsubmitボタンを押す site_top = agent.submit(search_form) # リンクをたどる site_top_link = site_top.links.text('ダウンロード') site_next = agent.get(site_top_link.href) # フォームを探す search_next_form = site_next.forms.with.name('myform').first # データを入力? search_next_form['from'] = '1' search_next_form['from_date[from_Year]'] = '2007' search_next_form['from_date[from_Month]'] = '03' search_next_form['from_date[from_Day]'] = '02' search_next_form['to'] = '1' #↓↓ここをどう書けばよいかで悩んでいます。。。とりあえずこのままでは期待したデータは取れておりません。 ## フォームのsubmit(ダウンロード)ボタンを押し、取得したデータをファイルに保存 #csv_file.puts agent.submit(search_next_form) #↑↑ここをどう書けばよいかで悩んでいます。。。とりあえずこのままでは期待したデータは取れておりません。 csv_file.close

  • WWW::Mechanizeについて教えてください

    WWW::Mechanizeついて 質問させて頂きます。 他でも質問しておりますが、回答が無かったためマルチですがご了承ください。 WWW::Mechanizeを使ってログインしようとしてるのですが、うまく行きません。 <form action="login.cgi" name="form1" method="post"> <input id=id name='id' type='text' /> <input id=pass name='pass' type='text' /> <input type="submit" name="submit" value="LOGIN" /> 上記のフォームでは正常に取得できます。 しかし、ログインチェックをJavascriptからPHPに渡ってるページでの ログインがうまく行きません。 ソース //入力チェック /*login_checkたとえです*/ function LOGIN(){ $( "userid" ).className = ""; $( "userpassword" ).className = ""; if( login_check( "id" ) ){ if( login_check( "pass" ) ){ document.form1.action = "login.php"; document.form1.Btn_Type.value = "login"; document.form1.submit(); }else{ $( "pass" ).className = "error"; } }else{ $( "id" ).className = "error"; } } <form action="login.php" name="form1" method="post"> <input id=id name='id' type='text' /> <input id=pass name='pass' type='text' /> <input type="button" name="loginbtn" value="LOGIN" onclick='JavaScript:LOGIN();'/> 上記のフォームにログインしようと下記のようにしました。 my $loginUrl = 'http://hoge.jp/login.php'; my $mech = WWW::Mechanize->new(cookie_jar => $cookie_jar); $mech->agent_alias('Windows IE 6'); $mech->get($loginUrl); $mech->form_name('form1'); $mech->field( id => "test" ); $mech->field( pass => "test" ); $mech->click_button( value => 'Login' ); print $mech->content(); これで実行するとエラーがでます。 Can't call method "header" on an undefined value at /usr/lib/perl5/site_perl/5.8.8/WWW/Mechanize.pm line 2471. $mech->click_button( value => 'Login' ); 上記のclick_buttonでvalueを指定するとエラーになります。 WWW::MechanizeはJavascriptは実行できないのでしょうか? お知恵をお貸しいただけませんでしょうか。 説明不足かもしれませんがお願い致します。

    • ベストアンサー
    • Perl
  • method="get"で全角が文字化けてしまう。

    Flashで「一行更新ニュース」が表示できる物を作ろうと思っています。 管理用のページから、GET methodでtest.sfw にテキストデータを送ろうとすると 全角テキストがすべて文字化け?してしまいます。 全角「1」が「?P」 回避方法を教えてください。

    • ベストアンサー
    • Flash
  • Ruby Mechanizeを使う事でサーバに負担を与える可能性はありますか?

    RubyのMechanizeを使い、欲しいページを取得するプログラムを書きました。 おおまかな手順としては、 (1)あるページに接続し、#page=agent.get('http://www.hoge.com') (2)フォームにID,PASSを入力し、submitボタンをクリックしてログイン。 (3)ログイン後のページに移動し、指定したページをローカルに保存。 ループ処理は行っていません。 プログラムが最後まで実行されたので問題は無いと思うのですが、サーバに負担を与える可能性はあるでしょうか? 自分のIDで証券会社のページに接続し、欲しいデータを取得するプログラムなので、不具合があってはいけないと思い質問させてもらいました。 宜しくお願いします。

専門家に質問してみよう