有人可以帮我理解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函数的精彩解释,我知道它有一些迷你函数,但我还不熟悉它,它有助于看你如何重新编写它作为一个正常的函数。
答案 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
。