jel*_*ngo 1 html python beautifulsoup html-parsing python-3.x
有人可以帮我理解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>
Run Code Online (Sandbox Code Playgroud)
好的,这是为了理解列表,所以,正在制作一个列表?但是没有被使用?他们为什么要这样做?另外,你什么时候以及为什么要在“for”这个词之前加上任何东西?正如他们在那里所做的那样。通常我在开头看到“for”,在它之前没有任何内容。另外,感谢您对 lambda 函数的精彩解释,我知道它制作了某种迷你函数,但我还不太熟悉它,它有助于了解您如何将其重新编写为普通函数。
方括号中的部分称为列表推导式- 基本上是创建列表的一种简短方法。
它没有分配给任何东西的原因是这里不需要它。extract()为每个找到的评论调用方法,它会在循环中删除每个评论。这实际上非常令人困惑,最好按照以下方式编写:
for comment in comments:
comment.extract()
Run Code Online (Sandbox Code Playgroud)
要了解什么soup.findAll(text=lambda text:isinstance(text, Comment)),您需要了解两个关键事项:
text论点的文件:text 是一个参数,可让您搜索 NavigableString 对象而不是标签。它的值可以是字符串、正则表达式、列表或字典、True 或 None 或以 NavigableString 对象作为参数的可调用对象
请注意,对我们来说最重要的是,textargument的值可以是 a callable,或者换句话说,是一个函数。
现在这lambda text:isinstance(text, Comment)是在 Python 中编写匿名函数的特殊语法。它与您拥有的相同:
def my_function(text):
return isinstance(text, Comment)
Run Code Online (Sandbox Code Playgroud)它所做的是检查每个NavigableString对象是否是Comment类的实例。换句话说,检查它找到的文本是否是 HTML 注释。
作为旁注,不要花时间,BeatifulSoup3因为它没有得到维护并且不再受支持,请切换到BeautifulSoup4.