

下記のサイトのプログラムでlamdaが使用されている箇所があるのですが、なんとなくコメントオブジェクトならエレメントに代入する意味になっていると思うのですが、itや
textが何を指しているのかよく分からないです。  
教えて頂けないでしょうか？

[code]

    div = soup.find('div', class_='foo')
    for element in div(text=lambda it: isinstance(it, Comment)):
        element.extract()
    
[/code]

コード出典  
<https://itqna.net/questions/68805/remove-comment-tag-and-its-contents-
beautifulsoup-4>


CC BY-SA 4.0
2021-02-01T06:09:40.370
73729
2021-02-01T09:56:29.410
2021-02-01T09:21:41.193
19110
22565
question
python python3 beautifulsoup
pythonのlamda式を普通の式に戻したい。


ラムダ式については先ずはPython公式のドキュメントを見てください。  
[6.14. ラムダ
(lambda)](https://docs.python.org/ja/3/reference/expressions.html?highlight=lambda#lambda)

> ラムダ式 (ラムダ形式とも呼ばれます) は無名関数を作成するのに使います。 式 `lambda parameters: expression`
> は関数オブジェクトになります。 この無名オブジェクトは以下に定義されている関数オブジェクト同様に動作します:
[code]

>     def <lambda>(parameters):
>         return expression
>  
[/code]

>
>
> 引数の一覧の構文は[関数定義](https://docs.python.org/ja/3/reference/compound_stmts.html#function-
> definitions)を参照してください。ラムダ式で作成された関数は文やアノテーションを含むことができない点に注意してください。

少し解説が追加されている記事はこちら：  
[Pythonのlambda（ラムダ式、無名関数）の使い方](https://note.nkmk.me/python-lambda-usage/)

> **def文とlambda式の対応関係**  
>
> def文による関数定義とそれに相当するラムダ式での無名関数の対応関係は以下のようになる。便宜上、ラムダ式に名前を割り当てている（ラムダ式を変数に代入している）が、Pythonのコーディング規約であるPEP8では非推奨となっている。後述。
[code]

>     def 名前(引数, 引数, ...):
>         return 式
>  
>     名前 = lambda 引数, 引数, ...: 式
>  
[/code]

なので`it`は関数として見た時の`引数`になります。

* * *

`text`については、こちらの[find_all()](http://kondou.com/BS4/#find-
all)の[text引数](http://kondou.com/BS4/#id33)の解説が該当するでしょう。

> `text`引数で、タグに挟まれている文字列を対象に検索することができます。 `name`引数やキーワード引数のように、 文字列 , 正規表現 ,
> リスト , 関数 , True値 が使えます。
>
> `text`引数はテキスト文字列の検索ですが、これにタグの検索を組みわせることもできます。 Beautiful
> Soupは、`text`引数で指定した文字列を`.string`にもつタグ全てを見つけます。

* * *

その上で「pythonのlamda式を普通の式に戻したい。」について、しかも質問のソースコードを対象とした対処としては、この記事が参考になるでしょう。  
[BeautifulSoup4でコメントタグの中身を取得する方法に腹落ちするまでの話](https://nao-y.hatenablog.com/entry/2018/05/25/212130)

丁度適用した最後のソースコードで閉じ括弧が抜けているので、上記記事のプログラム自身はエラーになりますが、それを当てはめると質問の以下の部分は：

[code]

    for element in div(text=lambda it: isinstance(it, Comment)):
    
[/code]

こちらの関数定義と：

[code]

    def is_comment(text):
        return isinstance(text, Comment)
    
[/code]

こちらの呼び出しになります：

[code]

    for element in div(text=is_comment):
    
[/code]


CC BY-SA 4.0
2021-02-01T09:54:50.320
73734
2021-02-01T09:54:50.320
26370
73729
answer


Beautiful Soup の和訳はこちら ==> <http://kondou.com/BS4/>

`lambda` の `it` は iterator/iterable のつもりかも？ 単なる引数名。  
関数にして, ここでは `tag`と記します

[code]

    def is_comment(tag):
      x = isinstance(tag, Comment)
      return x
    
    all_comment = div.find_all(text=is_comment)
    for elem in all_comment:
      elem.extract()
    
[/code]

[text引数](http://kondou.com/BS4/#id33) には「文字列 , 正規表現 , リスト , 関数 , True値
が使えます」とのこと。  
`text=is_comment` で関数を指定し, タグに挟まれている文字列を対象に検索。  
関数 `is_comment` 内で, 対象の要素がコメントなら `True`を返す ==> コメント要素？の一覧を得る

(※ Beautiful Soup 4.4.0 では, 以前からの `text` ではなく `string` 引数になった模様)

find_all がないのは [ショートカット](http://kondou.com/BS4/#id36)を使用しているため


CC BY-SA 4.0
2021-02-01T09:56:29.410
73735
2021-02-01T09:56:29.410
43025
73729
answer