62204


**.py**

[code]

    from bs4 import BeautifulSoup
    # urlは例です
    url = 'https://example.com'
    
    response = requests.get(url)
    data = response.text
    soup = BeautifulSoup(data, 'html.parser')
    
[/code]

**HTML**

[code]

    <div class='ttt'>
      <div class='red'></div>
      <div class='green'></div>
      <div class='blue'></div>
    </div>
    
[/code]

このようなHTMLからグリーン以外を取り出したいのですが、

[code]

    soup.find('div', {'class':'ttt'}).children
    
[/code]

を使ったらすべて取り出されてしまいます。  
このクラスの順番は毎回変わるので位置の指定はつかえないです。


CC BY-SA 4.0
2020-01-13T08:23:45.490
62202
2020-01-13T10:17:59.977
2020-01-13T09:00:38.700
32986
36091
question
python beautifulsoup
スクレイピングで子を一つだけ取り除く方法。


[decompose](https://www.crummy.com/software/BeautifulSoup/bs4/doc/#decompose)で不要な項目を削除してから取り出す方法はいかがでしょうか。

サンプルコード

[code]

    from bs4 import BeautifulSoup
    
    data = """
    <html>
    <body>
      <div class='ttt'>
        <div class='red'></div>
        <div class='green'></div>
        <div class='blue'></div>
      </div>
    </body>
    </html>
    """
    soup = BeautifulSoup(data, 'html.parser')
    soup.find('div', {'class':'green'}).decompose() # 項目削除
    for c in soup.find('div', {'class':'ttt'}).children:
       c
    
[/code]

実行結果

[code]

    '\n'
    <div class="red"></div>
    '\n'
    '\n'
    <div class="blue"></div>
    '\n'
    
[/code]


CC BY-SA 4.0
2020-01-13T09:13:50.393
62204
2020-01-13T10:17:59.977
2020-01-13T10:17:59.977
9820
9820
62202
answer


  * タグの属性へのアクセス([参考](http://kondou.com/BS4/#id14))
  * `find_all`へフィルタとして関数を渡せること([参考](http://kondou.com/BS4/#id30))

を利用すると次のように書けますね。

[code]

    from bs4 import BeautifulSoup
    
    data = '''
    <div class='ttt'>
      <div class='red'></div>
      <div class='green'></div>
      <div class='blue'></div>
    </div>
    '''
    
    soup = BeautifulSoup(data, features="html.parser")
    
    elems = soup.find('div', {
        'class': 'ttt'
    }).find_all(lambda d: 'green' not in d['class'])
    
    print(elems)
    
[/code]

実行結果

[code]

    [<div class="red"></div>, <div class="blue"></div>]
    
[/code]


CC BY-SA 4.0
2020-01-13T09:15:28.467
62205
2020-01-13T09:15:28.467
13199
62202
answer