你能解释一下python使用方括号的原因吗



有人能帮我理解beautifulsoup3文档中的这段代码吗?特别是我不理解方括号里的部分。代码来自以下网址:http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html我不理解方括号,因为我认为方括号是用来制作列表的,它的内容会创建列表吗?此外,它似乎没有将列表分配给任何内容。使用方括号而不将其分配给任何内容的目的是什么?此外,我不理解这个组件:text=lambda text:isinstance(text, Comment),但我想我可能可以自己解决这个部分。

from BeautifulSoup import BeautifulSoup, Comment
soup = BeautifulSoup("""1<!--The loneliest number-->
                        <a>2<!--Can be as bad as one--><b>3""")
comments = soup.findAll(text=lambda text:isinstance(text, Comment))
[comment.extract() for comment in comments]
print soup
# 1
# <a>2<b>3</b></a>

好吧,这是为了理解列表,所以,正在制作列表?但没有被使用?他们为什么要这样做?此外,你什么时候以及为什么要在"for"这个词之前加上任何东西?就像他们在下面做的那样。通常情况下,我一开始看到的是"for",之前没有任何内容。此外,感谢您对lambda函数的出色解释,我知道它制作了某种迷你函数,但我还不太熟悉,这有助于了解您如何将其重写为普通函数。

方括号中的部分称为列表理解-基本上是创建列表的一种简短方法。

它没有分配给任何东西的原因是这里不需要它。为每个找到的注释调用extract()方法,它将删除循环中的每个注释。它实际上非常令人困惑,最好用以下方式编写:

for comment in comments:
    comment.extract()

要了解什么是soup.findAll(text=lambda text:isinstance(text, Comment)),您需要了解两个关键内容:

  • 根据text论证文件:

text是用于搜索NavigableString对象的参数而不是标签。它的值可以是字符串、正则表达式、list或dictionary,True或None,或接受NavigableString对象作为其参数

请注意,对我们来说,最重要的是text参数的值可以是callable,或者换句话说,是一个函数。

  • 现在lambda text:isinstance(text, Comment)是一种用于在Python中编写匿名函数的特殊语法。它和你会有的一样:

    def my_function(text):
        return isinstance(text, Comment)
    

它所做的是将每个NavigableString对象都检查为Comment类的实例。换句话说,检查它找到的文本是否是HTML注释。


附带说明一下,不要在BeatifulSoup3上花费时间,因为它没有得到维护,也不再受支持,请切换到BeautifulSoup4

最新更新