BeautifulSoup和Python Lambda

tom*_*nez 5 python beautifulsoup python-3.x

我很难理解这段代码.

我想HTMLBeautifulSoup和提取注释Python3.

鉴于:

html = '''
       <!-- Python is awesome -->
       <!-- Lambda is confusing -->
       <title>I don't grok it</title>
       '''

soup = BeautifulSoup(html, 'html.parser')
Run Code Online (Sandbox Code Playgroud)

我搜索了解决方案,大多数人说:

comments = soup.find_all(text= lambda text: isinstance(text, Comment))
Run Code Online (Sandbox Code Playgroud)

在我的情况下会导致:

[' Python is awesome ', ' Lambda is confusing ']
Run Code Online (Sandbox Code Playgroud)

这就是我的理解:

  • isinstance询问if text是否为实例Comment并返回布尔值.
  • 我有点理解lambda.取text作为参数并评估isinstance表达.
  • 你可以传递一个函数 find_all

这是我不明白的:

  • 什么texttext=
  • 什么textlambda text
  • 从什么参数html传递到lambda text
  • soup.text回报I don't grok it.为什么lambda text传递<!-- Python is awesome -->作为一个论点?

Yon*_*ono 5

概括

.find_all()遍历每一行并尝试匹配text='<our_text>. 代替实际字符串(如下面的示例) '<our_text>'的是基本上具有条件的lambda函数。

我将解释这个问题的每一部分。

text=

html = '''
       <!--Python is awesome-->
       <!--Lambda is confusing-->
       <title>I don't grok it</title>
       '''

soup = BeautifulSoup(html, 'html.parser')
Run Code Online (Sandbox Code Playgroud)

print(soup.find_all(text='Python is awesome'))

输出:

['Python 太棒了']

这里text=只是一个参数(即参数),我们可以在其中传递正则表达式或另一个函数变量'string'. 在我们的例子中它恰好是一个lambda。接下来我们将解释 lambda 的作用。

Lambda

lambda函数接受text变量作为输入。

我们自动将每行的文本输入到 lambda-func 中.find_all

lambda text: isinstance(text, Comment) 
Run Code Online (Sandbox Code Playgroud)

isinstance检查第一个参数是否。textComment返回True还是False。示例:some_var = 'Ey man'那么我做isisntance(some_var, str)-> True这是一个字符串 (str)

接下来,我们将这两者结合起来。

soup.find_all(text= lambda text: isinstance(text, Comment))

  1. soup.find_all- 遍历每一行<--Python is awesome..<--Lambda.. <title>I..

  2. 我们有一个条件,.find_all(<the_condition>)并保留满足该条件的行

  3. 我们案例中的条件是,

    3.1. 首先,我们不检查所有内容,只检查清晰、纯英文文本和内部标签,和/或任何字符串。那是text=

    3.2. 文本也有一个条件,它不接受任何文本,只有当lambda 函数返回 True 时,即满足lambda的条件。

    3.3. lambda条件是它必须是一个Comment有意义的实例,只有当它是Comment时才会返回True

只有满足所有这些条件,我们才会采用该并存储它。