你能解释这个python使用的方括号吗?

时间:2014-11-10 05:02:53

标签: python html python-3.x beautifulsoup html-parsing

有人可以帮我理解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>

好的,所以列表理解是这样的,所以,正在制作一个列表?但没有被使用?他们为什么要这样做?此外,何时以及为什么要在&#34;之前放置任何内容?#34;?因为他们在那里。通常我会看到&#34;对于&#34;在开始时,没有任何事情。另外,谢谢你对lambda函数的精彩解释,我知道它有一些迷你函数,但我还不熟悉它,它有助于看你如何重新编写它作为一个正常的函数。

1 个答案:

答案 0 :(得分:4)

方括号中的部分称为list comprehension - 基本上是创建列表的简短方法。

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

for comment in comments:
    comment.extract()

要了解soup.findAll(text=lambda text:isinstance(text, Comment))您需要了解两件关键事项:

  • 根据text论证的文档:
  

text是一个允许您搜索NavigableString对象的参数   而不是标签。它的值可以是字符串,正则表达式,a   列表或字典,True或None,或者是一个可调用的   NavigableString对象作为其参数

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

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

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

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


作为旁注,请不要在BeatifulSoup3上花费时间,因为它不会被维护而且不再受支持,请切换到BeautifulSoup4