

以下のURLからテーブルデータを取ろうとしていますが、片方のURLの場合(aa1)だけうまくいきません。  
これは取ってくるデータの文字列に何か原因があるのでしょうか。また、色々他のサイトで調べた結果、encoding="cp932"と行ってもうまくいきませんでした。  
例えば、

[code]

    import pandas as pd
    aa0 = "https://db.netkeiba.com/race/201901010101"
    pd.read_html(aa0)
    
[/code]

出力は

[code]

        [   着順  枠番  馬番         馬名  性齢  斤量    騎手     タイム     着差     単勝  人気       馬体重  \
     0   1   1   1      ゴルコンダ  牡2  54  ルメール  1:48.3    NaN    1.4   1  518(-16)   
     1   2   3   3   プントファイヤー  牡2  54  岩田康誠  1:50.1      大    3.5   2   496(-8)   
     2   3   4   4  ラグリマスネグラス  牡2  51  団野大成  1:50.9      5   46.6   6   546(+6)   
     3   4   8   9     キタノコドウ  牡2  51  菅原明良  1:51.5  3.1/2   56.8   7   458(-8)   
     4   5   5   5   ネモフィラブルー  牡2  54  川島信二  1:51.7  1.1/2  140.3   9    436(0)   
     5   6   8   8  マイネルラクスマン  牡2  54  丹内祐次  1:52.1  2.1/2    9.7   3   480(+8)   
     6   7   2   2    サンモンテベロ  牝2  54   黛弘人  1:52.5  2.1/2  114.7   8   450(+2)   
     7   8   7   7   エスカレーション  牝2  54  藤岡佑介  1:52.5    アタマ   26.1   5   448(-4)   
     8   9   6   6   セイウンジュリア  牝2  54  池添謙一  1:52.6     クビ   16.4   4    470(0)   
     
             調教師  
     0  [東] 木村哲也  
     1  [東] 手塚貴久  
     2  [東] 藤沢和雄  
     3   [東] 高木登  
     4  [西] 矢作芳人  
     5  [東] 金成貴史  
     6  [東] 中野栄治  
     7  [東] 高柳瑞樹  
     8  [西] 浅見秀一  ,
         0      1          2    3
     0  単勝      1        140    1
     1  複勝    134  110110470  127
     2  枠連  1 - 3        190    1
     3  馬連  1 - 3        190    1,
          0                1           2      3
     0  ワイド  1 - 31 - 43 - 4  1208401100  11213
     1   馬単            1 → 3         290      1
     2  三連複        1 - 3 - 4        1610      6
     3  三連単        1 → 3 → 4        3560     10,
                 0                                           1
     0        馬場指数    プレミアサービスにご加入して頂くと馬場指数が確認できます。プレミアサービス案内へ
     1  馬場コメント (?)  プレミアサービスにご加入して頂くと馬場コメントが確認できます。プレミアサービス案内へ,
            0                      1
     0  1コーナー     1(4,3)6(5,8)2(9,7)
     1  2コーナー   1(3,8)4,6-(5,7)(2,9)
     2  3コーナー  (*1,3)(4,8)6-5,2(9,7)
     3  4コーナー     1,3-(4,8)6-5(9,2)7,
          0                                                  1
     0  ラップ  12.5 - 11.5 - 11.9 - 11.7 - 12.0 - 12.2 - 12.4...
     1  ペース  12.5 - 24.0 - 35.9 - 47.6 - 59.6 - 71.8 - 84.2...]
    
[/code]

同じように, aa1に渡したURLを読み込むと

[code]

    aa1 = "https://db.netkeiba.com/race/202204010202"
    pd.read_html(aa1)[0]
    
[/code]

エラー

[code]

        ---------------------------------------------------------------------------
    IndexError                                Traceback (most recent call last)
    <ipython-input-9-3b6afaad857c> in <module>
          2 aa0 = "https://db.netkeiba.com/race/201901010101"
          3 aa1 = "https://db.netkeiba.com/race/202204010202"
    ----> 4 pd.read_html(aa1)
    
    ~/opt/anaconda3/lib/python3.8/site-packages/pandas/util/_decorators.py in wrapper(*args, **kwargs)
        297                 )
        298                 warnings.warn(msg, FutureWarning, stacklevel=stacklevel)
    --> 299             return func(*args, **kwargs)
        300 
        301         return wrapper
    
    ~/opt/anaconda3/lib/python3.8/site-packages/pandas/io/html.py in read_html(io, match, flavor, header, index_col, skiprows, attrs, parse_dates, thousands, encoding, decimal, converters, na_values, keep_default_na, displayed_only)
       1083     io = stringify_path(io)
       1084 
    -> 1085     return _parse(
       1086         flavor=flavor,
       1087         io=io,
    
    ~/opt/anaconda3/lib/python3.8/site-packages/pandas/io/html.py in _parse(flavor, io, match, attrs, encoding, displayed_only, **kwargs)
        916     for table in tables:
        917         try:
    --> 918             ret.append(_data_to_frame(data=table, **kwargs))
        919         except EmptyDataError:  # empty table
        920             continue
    
    ~/opt/anaconda3/lib/python3.8/site-packages/pandas/io/html.py in _data_to_frame(**kwargs)
        795     # fill out elements of body that are "ragged"
        796     _expand_elements(body)
    --> 797     with TextParser(body, header=header, **kwargs) as tp:
        798         return tp.read()
        799 
    
    ~/opt/anaconda3/lib/python3.8/site-packages/pandas/io/parsers.py in TextParser(*args, **kwds)
       2227     """
       2228     kwds["engine"] = "python"
    -> 2229     return TextFileReader(*args, **kwds)
       2230 
       2231 
    
    ~/opt/anaconda3/lib/python3.8/site-packages/pandas/io/parsers.py in __init__(self, f, engine, **kwds)
        817             self.options["has_index_names"] = kwds["has_index_names"]
        818 
    --> 819         self._engine = self._make_engine(self.engine)
        820 
        821     def close(self):
    
    ~/opt/anaconda3/lib/python3.8/site-packages/pandas/io/parsers.py in _make_engine(self, engine)
       1048             )
       1049         # error: Too many arguments for "ParserBase"
    -> 1050         return mapping[engine](self.f, **self.options)  # type: ignore[call-arg]
       1051 
       1052     def _failover_to_python(self):
    
    ~/opt/anaconda3/lib/python3.8/site-packages/pandas/io/parsers.py in __init__(self, f, **kwds)
       2308                 self.num_original_columns,
       2309                 self.unnamed_cols,
    -> 2310             ) = self._infer_columns()
       2311         except (TypeError, ValueError):
       2312             self.close()
    
    ~/opt/anaconda3/lib/python3.8/site-packages/pandas/io/parsers.py in _infer_columns(self)
       2721                 columns = [names]
       2722             else:
    -> 2723                 columns = self._handle_usecols(columns, columns[0])
       2724         else:
       2725             try:
    
    IndexError: list index out of range
    
[/code]

となります。aa0,aa1のURLをweb上で直接叩いていただけると分かる通り、どちらも競馬の結果データが同じレイアウトで表示されています。しかし,aa1のURLだとうまくスクレイピングができていません。この理由がわからず、ご指摘お願いできますでしょうか。


CC BY-SA 4.0
2022-05-11T01:35:20.400
88751
2022-05-11T04:25:11.503
2022-05-11T04:17:55.603
29111
29111
question
python3 pandas
pd.read_htmlがうまく機能しない


[pandas.read_html](https://pandas.pydata.org/docs/reference/api/pandas.read_html.html)
では複数のテーブルを一度に読み込むので, 問題を切り分けるには一つずつ試すとよいかも。

頻繁に幾度もアクセスを試みるのは, サイトへの「攻撃」に繋がるので読み取るまでを区切りにします

[code]

    import pandas as pd
    import requests
    from bs4 import BeautifulSoup
    
    url = 'https://db.netkeiba.com/race/201901010101'
    url = 'https://db.netkeiba.com/race/202204010202'
    
    r = requests.get(url)
    soup = BeautifulSoup(r.content)
    
[/code]

あとは, 1つずつ確認していくとよいでしょう

[code]

    lst = soup('table')
    display(f'テーブル数: {len(lst)}')
    for tbl in lst:
        try:
            dfs = pd.read_html(str(tbl))
            #if len(dfs) == 1:
            #    display(dfs[0])
        except:
            display(tbl)
    
[/code]

問題箇所は, 4/6 番目のテーブルで内容が入って無さそうなところ  
(一応, 内容は伏せておきます)


CC BY-SA 4.0
2022-05-11T04:25:11.503
88755
2022-05-11T04:25:11.503
43025
88751
answer