89860


スクレイピングにおいて値が" 3月調査 "であるspanタグを取得し，そのdata-
value1属性値を取得したいと考えています。find_all関数を用いて以下のコードを実行しました。

実行コード

[code]

    soup.find_all('span', text=" 3月調査 ")
    
[/code]

取得したいhtmlタグ

[code]

    <span data-key="tstat" data-key1="tclass1" data-key2="tclass2" data-matter="2" data-value="000001014549" data-value1="000001162554" data-value2="000001164846">
                                    3月調査
                         <span class="stat-pc">[57件]</span>
    </span>
    
[/code]

結果は[]でした。どうすればタグ内の値が"3月調査"であるspanタグを取得できるでしょうか？


CC BY-SA 4.0
2022-07-09T08:25:50.207
89857
2022-07-09T12:00:31.813
2022-07-09T09:01:20.563
3060
52517
question
python beautifulsoup
beautifulsoupによるfind_allの利用方法について


タグ内の値に"3月調査"を含むspanタグを取得したい場合は`find_all`でタグを取得してから[`get_text()`](https://beautiful-
soup-4.readthedocs.io/en/latest/index.html#get-text)で対象を絞る方法があります。

**サンプルコード**

[code]

    from bs4 import BeautifulSoup
    import re
    
    html = """
    <html>
    <body>
    <span data-key="tstat" data-key1="tclass1" data-key2="tclass2" data-matter="2" data-value="000001014549" data-value1="000001162554" data-value2="000001164846">
                                    3月調査
                         <span class="stat-pc">[57件]</span>
    </span>
    </body>
    </html>
    """
    soup = BeautifulSoup(html, "html.parser")
    spans = [t for t in soup.find_all('span') if '3月調査' in t.get_text()]
    
    for t in spans:
        print(t.get_text(strip=True))
    
[/code]

なおご質問のコードではspanが入れ子になっているため、`get_text()`関数でテキストを取得すると`3月調査[57件]`のように入れ子のspanタグの中身も返ります。  
そのためサンプルコードの`if '3月調査' in t.get_text()`を`if t.get_text(strip=True) ==
'3月調査'`に書き換えるとヒットしなくなります。


CC BY-SA 4.0
2022-07-09T10:23:32.447
89860
2022-07-09T10:23:32.447
9820
89857
answer

[code]

    from bs4 import BeautifulSoup
    
    html = '''
    <span data-key="tstat" data-key1="tclass1" data-key2="tclass2" data-matter="2" data-value="000001014549" data-value1="000001162554" data-value2="000001164846">
                                    3月調査
                         <span class="stat-pc">[57件]</span>
    </span>
    <span data-key="tstat" data-key1="tclass1" data-key2="tclass2" data-matter="3" data-value="000001014550" data-value1="000001162555" data-value2="000001164847">
                                    4月調査
                         <span class="stat-pc">[15件]</span>
    </span>
    '''
    
    soup = BeautifulSoup(html, "html.parser")
    element = soup.select_one('span:-soup-contains("3月調査")')
    print(element['data-value1'])
    
    #
    # 000001162554
    
[/code]


CC BY-SA 4.0
2022-07-09T10:46:31.713
89862
2022-07-09T10:46:31.713
47127
89857
answer


`data-value1`属性について, の回答。  
ループの外側で調べる場合, マイナス記号含むので `attrs=` 引数与えるとよいかも  
ループの内側で調べる場合は, コメントアウトしてるのを外すとよい

[code]

    for span in soup.find_all('span', attrs={'data-value1': True}):
        #if not span.has_attr('data-value1'):
        #    continue
        if '3月調査' in span.text:
            print(f'element: {span}')
            print(f'text: {span.text.strip()}')
            val = span['data-value1']
            print(val)
    
[/code]


CC BY-SA 4.0
2022-07-09T12:00:31.813
89866
2022-07-09T12:00:31.813
43025
89857
answer