Python, Pandasを用いたスクレイピングでno tables foundのエラーが出てしまう。


下記のサイトからテーブルデータをPandasでスクレイピングしようとしています。  
No tables foundのエラーが出てしまいます。

Google Chromeでの要素の検証ではちゃんとテーブルの要素が表示されているのですが、ページのソースを表示するとテーブルらしいソースが見当たりません。

このテーブルのソースが別のところにあるとは思うのですが、ソースのリンクからはたどり着けませんでした。

ご教授お願いいたします。

[http://www.fehd.gov.hk/english/licensing/ecsvread_online_permit.html?page=1&subType=undefined&licenseType=Prepackaged%20Sushi%20and%2For%20Sashimi%20Permit&lang=en-
us](http://www.fehd.gov.hk/english/licensing/ecsvread_online_permit.html?page=1&subType=undefined&licenseType=Prepackaged%20Sushi%20and%2For%20Sashimi%20Permit&lang=en-
us)

[code]

    # coding: UTF-8
    import sys
    sys.path.append("/home/users////////")
    import pandas as pd
    import List2016 as R
    l_page = R.List
    df = pd.DataFrame([])
    
    base_url = 'http://www.fehd.gov.hk/english/licensing/ecsvread_food.html?page='
    suffix_url = '&subType=Approved%20to%20Sell%20Oyster%20to%20be%20Eaten%20in%20Raw%20State&licenseType=List%20of%20Licensed%20General%20Restaurants%20Approved%20to%20Sell%20Oyster%20to%20Be%20Eaten%20in%20Raw%20State%20for%20Consumption%20on%20the%20Premises&lang=en-us'
    
    for i in range(len(l_page)):
        url = base_url + str([i]) + suffix_url
        print(url)
        #try:
        fetched_dataframes = pd.read_html(url)
        print(fetched_dataframes)
    
        date = [l_page[i] for j in range(len(fetched_dataframes[0]))]
        df = pd.concat([df, fetched_dataframes[0]])
        #except:
            #print('error')
            #pass
    df.to_csv('licencedRes.csv')
    
[/code]




そのサイトの場合、テーブルデータをブラウザー側のJavaScriptで表示するようにしています。それで、ダウンロードした直後のhtmlを読み込んだのではテーブルは存在しません。

こういう場合にスクレイピングする方法は２つあります。

  1. chrome等の開発者ツールのネットワークを使って、Webサーバーからのレスポンスの内容を調べて、必要なデータが入っているレスポンスを探して、それをPythonでスクレーピングする。そのサイトのようにデータをjsonで送信している場合であれば、pandasでread_jsonすれば読めます。
  2. JavaScriptの処理が行われた後のhtmlを取得するためにHeadless Chromeを使うようにする。Headless Chromeを操作するツールにはGoogle純正のPuppeteerがあってそれを使うのが簡単なのですが、使用できる言語がNode.jsです。もしPythonを使いたい場合は、Seleniumを使うか、puppeteerの有志による独自Pythonポートであるpyppeteerを使うかのようです。




そのサイトの場合、テーブルデータをブラウザー側のJavaScriptで表示するようにしています。それで、ダウンロードした直後のhtmlを読み込んだのではテーブルは存在しません。

こういう場合にスクレイピングする方法は２つあります。

  1. chrome等の開発者ツールのネットワークを使って、Webサーバーからのレスポンスの内容を調べて、必要なデータが入っているレスポンスを探して、それをPythonでスクレーピングする。そのサイトのようにデータをjsonで送信している場合であれば、pandasでread_jsonすれば読めます。
  2. JavaScriptの処理が行われた後のhtmlを取得するためにHeadless Chromeを使うようにする。Headless Chromeを操作するツールにはGoogle純正のPuppeteerがあってそれを使うのが簡単なのですが、使用できる言語がNode.jsです。もしPythonを使いたい場合は、Seleniumを使うか、puppeteerの有志による独自Pythonポートであるpyppeteerを使うかのようです。

