• 締切済み

Pythonで、htmlソースを取得した時

urllib2.urlopen('url').read() 上記の方法でhtmlのソースを取得していますが、あるデータにおいて、 ブラウザ上→存在する ブラウザでソースを表示→存在する Pythonでソースを取得→存在しない といった事が起こり、取得出来ないデータがあります。 1. 何故このような事が起こるのか、考えられる原因 2. このデータをPythonで取得する方法はあるか、あるならどんな方法か 以上2点を教えてください。 宜しくお願いいたします。

みんなの回答

  • 777_kenyu
  • ベストアンサー率68% (22/32)
回答No.3

1の回答はブラウザとPythonで取得する情報に差異があるという質問を元に回答しているため、 前提条件が勘違いである場合には、そこに書いてある処置を行ってトラブルシューティングを続けていくべきではありません。 念のため。

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.2

こんにちは。 http://docs.python.jp/2/howto/urllib2.html 上記URLの「ヘッダ」という項目を参照してください。 1.2. アクセスしてきたブラウザの情報を参照しソースの出力を制御している可能性があります。 なので上記URLを参考にし適切なヘッダ情報を含めてhttpアクセスすることによりブラウザで表示したときと同じソースが取得できるようになると思います。

bombrea
質問者

お礼

回答有難うございます。すみません、ブラウザのソースには存在すると書きましたが、実際は違いました。ブラウザには表示されていますが、「ソースを表示」で確認すると存在しませんでした。該当箇所をChromeで選択して「要素を検証」すると存在するため、勘違いしていました。正しくはブラウザ上→存在する ブラウザでソースを表示→存在しない Pythonでソースを取得→存在しない です。 その後色々にらめっこして、多分・・ブラウザがJavascriptで表示させているデータかと今は予想しています。なんとかJavascriptの実行結果を得る方法で模索してみたいと思います。 教えていただいたヘッダ情報は設定していなかったので、これからは設定した上で続けていこうと思います。 有難うございました。

  • 777_kenyu
  • ベストアンサー率68% (22/32)
回答No.1

まずは原因を特定することかと思います。 ans = urllib2.urlopen('url') みたいな感じで… 考えられる原因: ・urlopenで何らかのエラーが発生している  (1) urlの中にエンコードが必要な文字列が混ざっている(空白とか)     → urllib.quote など適切な物を使ってあげる  (2) 失敗するurlではPythonと違う経路でデータ取得するようにブラウザ側で設定されている     → Pythonを起動するシェルの環境変数 http_proxy 等の必要な物を設定する etc.

bombrea
質問者

お礼

回答有難うございます。すみません、ブラウザのソースには存在すると書きましたが、実際は違いました。ブラウザには表示されていますが、「ソースを表示」で確認すると存在しませんでした。該当箇所をChromeでドラッグ・選択して「要素を検証」すると存在するため、勘違いしていました。正しくはブラウザ上→存在する ブラウザでソースを表示→存在しない Pythonでソースを取得→存在しない です。 その後色々にらめっこして、多分・・ブラウザがJavascriptで表示させているデータかと今は予想しています。なんとかJavascriptの実行結果を得る方法で模索してみたいと思います。 教えていただいた環境変数は設定していなかったので、これからは設定した上で続けていこうと思います。 有難うございました。

関連するQ&A

  • pythonでjavascriptを取得したい

    検索結果を自動で取得するツールを作成しています。 ページ内のリンク先URLを取得することはできたのですが リンク先のページにjavascriptが使われていて詰まっております。 import re import pycassa import urllib import urlparse import string import urlparse import json d=urllib.urlopen("最初のページ") print d.read().decode("sjis") aa=d.readlines() d.close() for bb in aa: if(re.search('リンク先',bb)): s="http://(リンク先とつなげて表示)" url2=s+cc2 f=open(url2) data.json.load("f") f.close() print(data) 検索してJSONを使ってみたのですが良い結果にならず、 どう工夫したらよいか教えていただけないでしょうか。

  • Pythonプログラムのエラー

    こんにちは。pythonプログラムを勉強しはじめたばかりのものです。 次のプログラムが最後の行の#のところでエラーになってなかなか 解決ができません。アドバイスいただけませんでしょうか。 #! /python30/python # coding:shift_jis import sys, os, urllib, gzip def GetAndGzip(url, out): ''' urlを読み込み、gzipで圧縮してファイルoutに出力 ''' remote = urllib.urlopen(url).read() gzfile = gzip.GzipFile(filename='', mode='web', fileobj=out) gzfile.write(remote) gzfile.colse() #パラメータを抽出 if len(sys.argv) <> 2: print '使い方:python wgetgz.py url' else: url = sys.argv[1] GetAndGzip(url, sys.stdout) #ここでエラーin<module> #ここで投稿すると、インデントがなくなってしまうようです。

  • python urlopen error について教えてください

    pythonを、勉強したてです。 開発環境は、python2.6/win XP です。 HTMLを解析するために、 http://www.crummy.com/software/BeautifulSoup/ からライブラリーを入手して、C:\Python26\Lib\site-packages\BeautifulSoup-3.1.0.1 に配置しました。 python環境設定のパスは、通してあります。 プログラムは、http://www.freia.jp/taka/blog/169 の「myparser.py」をそのまま使いました。(動作テストのため) ------- 結果 -------- メッセージ ファイル名 行 位置 Traceback <module> C:\Python26\src\myparser.py 50 main C:\Python26\src\myparser.py 41 urlopen C:\Python26\Lib\urllib2.py 124 open C:\Python26\Lib\urllib2.py 383 _open C:\Python26\Lib\urllib2.py 401 _call_chain C:\Python26\Lib\urllib2.py 361 http_open C:\Python26\Lib\urllib2.py 1130 do_open C:\Python26\Lib\urllib2.py 1105 URLError: <urlopen error [Errno 11001] getaddrinfo failed> ネットワーク環境は、プロキシ・サーバを返していますが、どうやっても上記のエラーで引っ掛かってしまいます。

  • Pythonスクリプトが実行できない

     インターネット上で公開されているスクリプトなのですが、実行しようとするとエラーが出てしまいます。どうすれば正しく実行することができるのか、分かる方教えていただけると助かります。よろしくお願いします。  エラーメッセージはスクリプトの下に記載します。  ニコニコ動画にログインし、マイページに新規マイリストを作成して、任意の動画をマイリストに登録するスクリプトです。 #!/usr/bin/env python #coding: utf8 userid="ここにメールアドレスを入力" passwd="ここにパスワードを入力" import sys, re, cgi, urllib, urllib2, cookielib, xml.dom.minidom, time import simplejson as json def getToken(): html = urllib2.urlopen("http://www.nicovideo.jp/my/mylist").read() for line in html.splitlines(): mo = re.match(r'^\s*NicoAPI\.token = "(?P<token>[\d\w-]+)";\s*',line) if mo: token = mo.group('token') break assert token return token def mylist_create(name): cmdurl = "http://www.nicovideo.jp/api/mylistgroup/add" q = {} q['name'] = name.encode("utf8") q['description'] = "" q['public'] = 0 q['default_sort'] = 0 q['icon_id'] = 0 q['token'] = token cmdurl += "?" + urllib.urlencode(q) j = json.load( urllib2.urlopen(cmdurl), encoding='utf8') return j['id'] def addvideo_tomylist(mid,smids): for smid in smids: cmdurl = "http://www.nicovideo.jp/api/mylist/add" q = {} q['group_id'] = mid q['item_type'] = 0 q['item_id'] = smid q['description'] = u"" q['token'] = token cmdurl += "?" + urllib.urlencode(q) j = json.load( urllib2.urlopen(cmdurl), encoding='utf8') time.sleep(0.5) #ログイン opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar())) urllib2.install_opener(opener) urllib2.urlopen("https://secure.nicovideo.jp/secure/login", urllib.urlencode( {"mail":userid, "password":passwd}) ) #トークン取得 token = getToken() #マイリストの作成と動画の登録 mid = mylist_create(u"テストリスト") addvideo_tomylist(mid, ["sm9","sm1097445", "sm1715919" ] ) <エラーメッセージ> >>> #?^í?^°?^¤?^ó ... opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar())) >>> urllib2.install_opener(opener) >>> urllib2.urlopen("https://secure.nicovideo.jp/secure/login", ... urllib.urlencode( {"mail":userid, "password":passwd}) ) <addinfourl at 4311877104 whose fp = <socket._fileobject object at 0x101007758>> >>> #?^?^??^ü?^¯?^ó?^?^??^? ... token = getToken() Traceback (most recent call last): File "<stdin>", line 2, in <module> File "<stdin>", line 8, in getToken UnboundLocalError: local variable 'token' referenced before assignment >>> #?^?^??^¤?^ê?^¹?^?^??^???^??^?^??^???^?^??^Ի?^???^ٻ?^̲ ... mid = mylist_create(u"?^?^??^¹?^?^??^ê?^¹?^?^?") Traceback (most recent call last): File "<stdin>", line 2, in <module> File "<stdin>", line 9, in mylist_create NameError: global name 'token' is not defined >>> addvideo_tomylist(mid, ["sm9","sm1097445", "sm1715919" ] ) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'mid' is not defined >>> <環境>imac, mac os x, ターミナルを使用

    • 締切済み
    • Mac
  • pythonでエラー「out of memory」

    python seleniumでエラー「out of memory」の解決策を教えてほしいです。 python seleniumでブラウザの自動操作を行っています。 一覧の画面にボタンがあり、For文で繰り返し画面遷移を行っています。 処理が進むにつれてメモリがどんどん増え、最終的にメモリ不足で処理が停止してしまいます。 tracemallocでメモリの容量を見たところ 下記の2つが処理が進むにつれてメモリどんどん増えています。 C:\Users\xxx\AppData\Local\Programs\Python\Python311\Lib\urllib\parse.py:387: size=27.0 KiB, count=257, average=108 B C:\Users\xxx\AppData\Local\Programs\Python\Python311\Lib\urllib\parse.py:411: size=25.5 KiB, count=256, average=102 B ファイルの内容としてはurlが関係しているのかなと考えています。 parse.py:387⇒splitresult = urlsplit(url, scheme, allow_fragments) parse.py:411⇒return url[start:delim], url[delim:] parse.pyはシステムファイル?のためどのようにメモリの解放を行えばよいのか調査しましたが解決策が思い浮かびませんでした。 途中でメモリの解放等を行う方法がありますでしょうか?

  • pythonでスクレイピングがうまく出来ません

    python2.7でbeautifulsoupを用いて、netkeiba.comから競馬情報(騎手の成績)をスクレイピングしています。 定法に基づきまして、『検証』からページのツリー構造を把握して、プログラムを作成しました。 馬名部分の構造が<td class="txt_l"> <a href="/horse/2011105901">テンテマリ</a></td> #テンテマリは馬名 となっておりましたので、"txt_l"を拾い出せるようにスクリプトを作りました。 しかしながら、 馬名以外の"txt_l"は全部スクレイピング出来るのですが、馬名部分だけがNoneと返ってまいります。 エラーメッセージではありませんが、何が原因でNoneとなるのかが、どうしても分かりません。 ちなみに、馬名以外で、ほぼ同様の構造を持つ、『レース名』、構造は <td class="bml txt_l"> <a href="/race/201603020812/" title="3歳上500万円下">3歳上500万円下</a> (3歳上500万円下はレース名) では、問題なくレース名を拾うことが出来ました。 該当のソースコード -*- coding:utf-8 -*- import urllib2 import codecs from bs4 import BeautifulSoup tpl_url='http://db.netkeiba.com/?pid=jockey_detail&id=00663&page={0}' for i in xrange( 1, 2 ): url=tpl_url.format( i ) soup = BeautifulSoup(urllib2.urlopen(url).read(),"lxml") tr_arr = soup.find('div', {'id':'contents_liquid'}).findAll('tbody') for tr in tr_arr: lrg1 = tr.findAll('td',{'class':'txt_l'}) for tr1 in lrg1: print tr1.string 試したこと 馬名以外の('td',{'class':'txt_l'})に準ずる『レース名』は、うまく拾うことが出来ました。 lrg1 = tr.findAll('td',{'class':'txt_l'}) で馬名を得ることが出来ない理由、併せて馬名を拾えるスクリプトを御教示くださいますよう、よろしくお願いいたします!

  • ブラウザ(Google Chrom)でYahooのソースを見るとソース

    ブラウザ(Google Chrom)でYahooのソースを見るとソースがきちんと行で分けられているんですが、 vbで取得するとブラウザで見たようにきちんと表示されません。 ブラウザが独自に整形でもしているのかと思ったのですが、 Pythonで取得してもブラウザで取得したのと同じように表示されます。 またvbで取得した時もパケットキャプチャで見るときちんと取れています。 vbで取得しない方法でやろうと思いBASP21のW3getも使ってみましたがvbと同じ結果になりました。 文字コードがおかしいのかと思い何種類か変えてみましたが日本語がおかしくなるだけした。 もうお手上げ状態なので誰かわかる方教えてください。

  • csvファイルに保存が出来ずに困っています!!

    python初心者でございます。 python2.7,beautifulsoupを用いて競馬情報をスクレイピングしましたが、 作成されたhorse.csvファイルにデータ保存が出来ず、困っております。 csvファイルに保存出来るスクリプトを、御教示よろしくお願いいたします。 小生が作成したソースコード -*- coding:utf-8 -*- import urllib2 import codecs from bs4 import BeautifulSoup f = codecs.open('horse.csv', 'w', 'utf-8') f.write('tr1') tpl_url='http://db.netkeiba.com/?pid=jockey_detail&id=00663&page={0}' for i in xrange( 1, 2 ): url=tpl_url.format( i ) soup = BeautifulSoup(urllib2.urlopen(url).read(),"lxml") tr_arr = soup.find('div', {'id':'contents_liquid'}).findAll('tbody') for tr in tr_arr: lrg1 = tr.findAll('td',{'class':'txt_l'}) for tr1 in lrg1: print tr1.a.string f.close() 試したこと 上記のプログラムを動かすと作成されたCSVファイルには何も記録、保存されておりませんでした。 御教示よろしくお願いいたします!!!

  • VBAからhttpを呼びソースを取得

    ブラウザでURLを指定すると、htmlがサーバーから返され表示されます。 それをVBAからURLを指定し、htmlのソースを文字列で受け取りたいと思います。 普通にshellで渡すとブラウザが起動されてしまうし・・・。 方法があれば教えてください。

  • PHPでHTMLソースを取得する方法はありますか?

    PHPでHTMLソースを取得する方法はありますか? RSSで複数のHTMLソースを取得しました。 以下のことをやりたいのですが、こういったことは可能でしょうか? ・複数のHTMLソースを取得する(同じサイトからなのでタグの種類も大体同じものです) ・その中から<data>タグを取得する(dataの中にはそれぞれ適当な数字が入っています) ・それをソートして、ソート順にURLを表示する。 このようなことは可能でしょうか? $RSS=RSSのURL(XML) foreach($RSS as $value){ $URL[]=$value->URL; } for ($i = 0, $n = count($URL); $i < $n; $i++) { echo $URL[$i] . "<br />"; } これでそれぞれのURLが URL1 URL2 URL3 とそれぞれ表示されます。これらのURLからそれぞれの<data>タグを取得して上のようなことをやりたいです。 説明が下手で申し訳ありませんが、よろしくお願いします。

    • ベストアンサー
    • PHP