【问题标题】:Can you explain this python use of square brackets?你能解释一下这个python使用方括号吗?
【发布时间】:2015-01-06 08:38:05
【问题描述】:

有人可以帮我理解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 函数的精彩解释,我知道它制作了某种迷你函数,但我还不太熟悉,它有助于了解您如何将其重写为普通函数。

【问题讨论】:

  • 方括号的行是list comprehension
  • 哦,很奇怪,我刚试过这个:[print("stuff") for x in range(0,10)] ,它起作用了,所以列表理解方括号的“副作用”是你可以为循环创建一行?

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


【解决方案1】:

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

它没有分配给任何东西的原因是这里不需要它。 extract() 方法会为每个找到的评论调用,它会在循环中删除每个评论。这实际上很混乱,最好是这样写:

for comment in comments:
    comment.extract()

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

  • 根据text 参数的文档:

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

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

  • 现在lambda text:isinstance(text, Comment) 是一种在 Python 中编写匿名函数的特殊语法。它与您将拥有的相同:

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

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


顺便说一句,不要花时间在BeatifulSoup3 上,因为它没有得到维护并且不再受支持,请切换到BeautifulSoup4

【讨论】:

  • +1 列表理解不应用于副作用
  • 那么,你说的这些副作用是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
相关资源
最近更新 更多