45560


やりたいことは[リンクHP](http://163.49.30.82/cgi-
bin/DspDamData.exe?KIND=1&ID=1368030375180&BGNDATE=20180705&ENDDATE=20180711&KAWABOU=NO)（下のpythonコードのurlと同じです）の背景がグレーの部分のデータをDataframeに格納することです．  
背景がグレーの部分はリンク先のページに埋め込まれたhtmlファイルとなっていまして，リンクHPのソースを見ると

[code]

    html
    </TABLE>
      <IFRAME src="/html/frm/DamFreeData2018071116325029223.html" 
      scrolling="AUTO" width="840" height="65%" align="center" frameborder="0"  
      style="border-width : 0px 0px 0px 0px;"></IFRAME>
    </CENTER>
    
[/code]

の「/html/frm/DamFreeData2018071116325029223.html」にデータのリンクが張られています．直接pandas.read_html(/html/frm/DamFreeData2018071116325029223.html)するのも1つの解決策なのですが，事情により最初に冒頭のHPに接続して，ソースのhtmlから'/html/frm/DamFreeData2018071116325029223.html'を取得したいのです．

現状は

[code]

    #!/usr/bin/python
    import pandas as pd
    import numpy as np
    
    url='http://163.49.30.82/cgi-bin/DspDamData.exeKIND=1&ID=609061289920060&BGNDATE=20120701&ENDDATE=20120731&KAWABOU=NO'
    dfs = pd.read_html(url)
    #dfs = pd.read_html(url, header=0,index_col=0)#htmlを読み込む
    print(dfs)
    
[/code]

とするとほしいデータの部分がNaNと表示されてしまいます．どなたか解決策を教えていただけないでしょうか？


CC BY-SA 4.0
2018-07-12T13:52:02.217
45558
2018-11-13T12:33:27.947
2018-11-13T12:33:27.947
26604
26604
question
python pandas web-scraping
webページのソースに貼られたリンク先のhtmlファイルを取得する


以下の段階にわけて処理する必要があると思います。

  1. 任意期間ダム諸量検索結果 ページへのアクセス
  2. iframeのsrc取得
  3. iframeのsrcからデータ読み込み

`python scraping`をキーワードに見付けた、以下の記事を参考に記載しています。

[PythonでWebスクレイピングする時の知見をまとめておく](https://vaaaaaanquish.hatenablog.com/entry/2017/06/25/202924)

## 事前インストール

[code]

    $ pip install requests beautifulsoup4 lxml
    
[/code]

## コード

[code]

    import pandas as pd
    import numpy as np
    import requests
    from bs4 import BeautifulSoup
    import urllib.parse
    
    # 任意期間ダム諸量検索結果 ページへのアクセス
    page_url = "http://163.49.30.82/cgi-bin/DspDamData.exe?KIND=1&ID=1368030375180&BGNDATE=20180705&ENDDATE=20180711&KAWABOU=NO"    
    res = requests.get(page_url)
    soup = BeautifulSoup(res.text, "lxml")
    
    #  iframeのsrc取得
    data_src = soup.iframe['src']  #=> /html/frm/DamFreeData2018071300300727273.html
    data_url = urllib.parse.urljoin(page_url, data_src) #=> http://163.49.30.82/html/frm/DamFreeData2018071300194826006.html
    
    #  iframeのsrcからデータ読み込み
    dfs = pd.read_html(data_url)
    print(dfs)
    
[/code]


CC BY-SA 4.0
2018-07-12T15:41:43.633
45560
2018-07-12T16:24:52.657
2018-07-12T16:24:52.657
45558
answer