【问题标题】:BeautifulSoup and Python LambdaBeautifulSoup 和 Python Lambda
【发布时间】:2018-10-04 19:02:03
【问题描述】:

我很难理解这段代码。

我想使用BeautifulSoupPython3 提取HTML cmets。

给定:

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

soup = BeautifulSoup(html, 'html.parser')

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

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

在我的情况下会导致:

[' Python is awesome ', ' Lambda is confusing ']

这是我的理解:

  • isinstance 询问 text 是否是 Comment 的实例并返回一个布尔值。
  • 我有点理解lambda。将 text 作为参数并计算 isinstance 表达式。
  • 您可以将函数传递给find_all

这是我不明白的:

  • text= 中的text 是什么?
  • lambda text 中的text 是什么?
  • 来自html 的参数被传递到lambda text
  • soup.text 返回I don't grok it。为什么lambda text&lt;!-- Python is awesome --&gt; 作为参数传递?

【问题讨论】:

  • 听起来你真的需要一个基本的 Python 教程,然后详细阅读相关的 beautifulsoup 文档。如果您不具备基本 Python 构造的工作知识,则很难理解这些文档。我告诉你这个是因为在你理解基本概念之前,即使你在这里得到的解释也不会像他们应该的那样帮助你。虽然一头扎进一门学科确实是一种很好的学习方式,但基础知识也很重要。
  • @MadPhysicist 你能澄清一下我需要什么基础知识吗?我认为我对基本的 Python 很擅长。

标签: python python-3.x beautifulsoup


【解决方案1】:

总结

.find_all() 遍历每一行并尝试匹配text='&lt;our_text&gt;'&lt;our_text&gt;' 是一个 lambda 函数,它基本上有一个条件,而不是一个实际的字符串 (就像下面的例子)

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

text=

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

soup = BeautifulSoup(html, 'html.parser')

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

输出:

['Python 很棒']

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

Lambda

这个 lambda 函数将text 变量作为输入。

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

lambda text: isinstance(text, Comment) 

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 - 遍历每一行 &lt;--Python is awesome.., &lt;--Lambda.. &lt;title&gt;I..

  2. 我们在.find_all(&lt;the_condition&gt;) 中有一个条件,并保留满足该条件的行

  3. 在我们的例子中,条件是,

    3.1。首先,我们不会只检查清晰、简单的英文文本和inside tags,和/或任何string。那是text=

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

    3.3。 lambda condition 是它必须是 Comment 的实例,这意味着只有当它是 Comment 时才会返回 True

只有且仅当所有这些条件都满足时,我们才会使用该行并将其存储。

【讨论】:

  • @tomorodonez 我已经在我的回答中详细解释了它,如果我应该澄清其他任何事情,请告诉我。如果要改进我的答案,我也将不胜感激编辑(建议或其他方式)。任何东西,可读性 -- 功能 -- 有效性。
  • 感谢您提供详细信息。我认为唯一的变化是在深入研究 BS4 文档之后。它说text 参数被string 替换。那么lambda 中的text 变量可以是任何东西。如:soup.find_all(string= lambda html_comment: isinstance(html_comment, Comment))。谢谢。
  • text 仍受支持。是的,非常好的理解,也感谢您努力研究docs,您提出了一个受过教育且令人生畏的问题,并且没有任何研究,任何人都很难解释所有这些。保重!
【解决方案2】:

text=中的文本是什么?

find_all 函数的关键字参数

什么是 lambda 文本中的文本?

函数的参数,同

def <name>(text)...

html 中的什么参数被传递到 lambda 文本中

这取决于您,在示例中,变量 Comments 指的是要解析的文本。

soup.text 返回我不明白。为什么 lambda 文本作为参数传递?

这只是一个要替换为真实 HTML 的示例

【讨论】:

  • 谢谢。你能澄清一下吗?我知道 text= 是一个关键字参数。但它的价值是什么?我知道 lambda text 与 def name(text) 相同。但是那里的文本价值是什么?没有变量评论。以上comments 是指结果列表,而不是要解析的文本。用真正的 HTML 代替是什么意思?谢谢。
  • 值是 lambda(换句话说,一个函数定义)。 lambda 定义中的 text 值是在运行时由 find_all 调用时设置的。 Comment 是在 isinstance 中测试的类型。您发布的示例代码具有示例 html,在现实世界中它将是真实的!就像你现在正在查看的这个页面的 html。
猜你喜欢
  • 1970-01-01
  • 2021-05-18
  • 2018-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 2012-01-15
相关资源
最近更新 更多