68086


BeautifulSoup4でホームページから情報取得をする勉強をしているのですが空白を含んだclassを指定して取得する方法がわかりません。  
具体例だと  
[https://race.netkeiba.com/race/result.html?race_id=202006010810&rf=race_submenu](https://race.netkeiba.com/race/result.html?race_id=202006010810&rf=race_submenu)  
の【後3F】の部分で、背景に色がついているものは'Time BgYellow'のようになっているので

[code]

    soup.find(class_ = 'Time ')
    
[/code]

や

[code]

    soup.find(class_ = 'Time.')
    
[/code]

で取得できるのですが背景に色がついていないものは'Time 'となっており↑の方法では取得できません。  
何か解決策はありますでしょうか？


CC BY-SA 4.0
2020-06-28T08:26:41.593
68078
2020-06-28T17:14:00.190
27760
question
python beautifulsoup
BeautifulSoup4で空白文字を含んだclassの中身を取得したい


本家SOの[類似質問の回答](https://stackoverflow.com/a/46719313)で、[CSS
selectors](https://www.crummy.com/software/BeautifulSoup/bs4/doc/#searching-
by-css-class)を使う方法が例示されています。

スペース区切りで`Time`を含むクラスが全て取得できます。

**サンプルコード:**

[code]

    from bs4 import BeautifulSoup
    
    html = """
    <!DOCTYPE html>
    <html>
    <body>
    <table>
    <tr>
    <td class="Time ">35.5</td>
    <td class="Time BgOrange">35.2</td>
    <td class="Time"><span class="RaceTime">1:36.7</span></td>
    <td class="NotTime">36.7</td>
    <td class="It is Time">36.7</td>
    </tr>
    </table>
    </body>
    </html>
    """
    
    soup = BeautifulSoup(html, 'html.parser')
    print(soup.select("td.Time"))
    
[/code]

**出力結果:**

[code]

    [<td class="Time">35.5</td>, <td class="Time BgOrange">35.2</td>, <td class="Time"><span class="RaceTime">1:36.7</span></td>, <td class="It is Time">36.7</td>]
    
[/code]

`It is Time`クラスがヒットし、`NotTime`クラスはヒットしません。


CC BY-SA 4.0
2020-06-28T10:33:42.307
68081
2020-06-28T10:33:42.307
9820
68078
answer


@payaneco さんの回答にもありますが、`soup = BeautifulSoup(html,
'html.parser')`の処理を通した時点でクラス名文字列の後ろに付いた空白は削られています。(おそらく文字列の前に空白が付いていても削られると思われます)

そのため、`BeautifulSoup()`処理後のデータを使った場合は、クラス名など属性文字列の前後に空白が有るか無いかの差で何かを判定することは出来ないでしょう。

質問で紹介されたページの場合、`class="Time"`が指定されたフィールドは他にも多数あるので、クラス名を元に取得したデータが何処のデータかを判定することは困難だと考えられます。

抽出したデータの場所や内容にかかわらず`class="Time"`のデータを集めているならば、@payaneco さん回答の方法で大丈夫でしょう。

そうでなくて、「後3F」の列のデータを取得したい場合は、他の方法を探すことになります。  
その1つがテーブルデータをひと固まりで取り出して、その中から「後3F」の列のデータを取り出す方法です。

以下の記事を参考にしています。  
[How to extract table column and rows using beatifulsoup
python](https://stackoverflow.com/q/43603122/9014308)

紹介ページの該当表のidが`All_Result_Table`で、「後3F」の列が0オリジンで11番目となっており、それを基に上記記事を参考に以下のようにプログラムを組んでみます。

[code]

    import requests
    import bs4
    
    url = 'https://race.netkeiba.com/race/result.html?race_id=202006010810&rf=race_submenu'
    res = requests.get(url)
    res.raise_for_status()
    soup = bs4.BeautifulSoup(res.text, "html.parser")
    tbody = soup.find_all(id='All_Result_Table')[0].tbody
    
    aft3f = []
    for tr in tbody.find_all('tr'):
        td = tr.find_all('td')[11]
        aft3f.extend([td])
    
    for td in aft3f:
        print(td)
    
[/code]

結果は以下のようになります。

[code]

    <td class="Time BgYellow">
    34.4
    </td>
    <td class="Time BgBlue02">
    34.9
    </td>
    <td class="Time">
    35.5
    </td>
    <td class="Time">
    35.3
    </td>
    <td class="Time">
    35.6
    </td>
    <td class="Time BgOrange">
    35.2
    </td>
    <td class="Time">
    35.9
    </td>
    <td class="Time">
    35.8
    </td>
    <td class="Time">
    35.8
    </td>
    <td class="Time">
    35.6
    </td>
    <td class="Time">
    35.8
    </td>
    
[/code]


CC BY-SA 4.0
2020-06-28T17:14:00.190
68086
2020-06-28T17:14:00.190
26370
68078
answer