Beautiful Soup – 搜索树
有许多Beautifulsoup方法,允许我们搜索解析树。两个最常用的方法是 find() 和 find_all()。
在谈论find()和find_all()之前,让我们看看你可以传递给这些方法的不同过滤器的一些例子。
过滤器的种类
我们有不同的过滤器可以传入这些方法,对这些过滤器的理解是至关重要的,因为这些过滤器在整个搜索API中被反复使用。我们可以根据标签的名称、属性、字符串的文本或它们的混合来使用这些过滤器。
一个字符串
最简单的过滤器类型之一是字符串。向搜索方法传递一个字符串,Beautifulsoup将对该确切的字符串进行匹配。
下面的代码将找到文档中所有的
标签 –
正则表达式
你可以找到所有以给定字符串/标签开始的标签。在这之前,我们需要导入re模块来使用正则表达式。
列表
你可以通过提供一个列表来传递多个要查找的标签。下面的代码可以找到所有的和
<
pre>标签 –
True
True将返回它能找到的所有标签,但不包括其本身的字符串 —
为了只返回上述汤中的标签–
find_all()
你可以使用find_all从页面响应中提取一个特定标签的所有出现,如-
语法
让我们从IMDB中提取一些有趣的数据–有史以来的 “最高评分电影”。
从上面,我们可以看到find_all会给我们提供所有符合我们定义的搜索条件的项目。所有我们可以在find_all()中使用的过滤器都可以用于find()和其他搜索方法,如find_parents()或find_siblings()。
find()
我们在上面看到,find_all()是用来扫描整个文档以找到所有内容的,但是有些东西,要求只找到一个结果。如果你知道文档只包含一个<body>
标签,那么搜索整个文档是浪费时间的。一种方法是每次都调用limit=1的find_all()方法,或者我们可以使用find()方法来做同样的事情。
语法
因此,以下两种不同的方法给出了相同的输出−
在上面的输出中,我们可以看到find_all()方法返回一个包含单个项目的列表,而find()方法返回单个结果。
find()和find_all()方法的另一个区别是 —
如果soup.find_all()方法找不到任何东西,它将返回空列表,而find()则返回无。
find_parents() 和 find_parent()
与find_all()和find()方法不同的是,find_parents()和find_parents方法()做的是相反的事情,它们向上遍历树,寻找一个标签(或一个字符串)的父代。
语法
还有其他八种类似的方法–
其中、
find_next_siblings() 和 find_next_sibling( ) 方法将遍历当前元素之后的所有兄弟姐妹。
find_previous_siblings() 和 find_previous_sibling() 方法将遍历当前元素之前的所有兄弟姐妹。
find_all_next() 和 find_next() 方法将遍历当前元素之后的所有标签和字符串。
find_all_previous 和 find_previous() 方法将遍历当前元素之前的所有标签和字符串。
CSS选择器
BeautifulSoup库支持最常用的CSS选择器。你可以在select()方法的帮助下使用CSS选择器来搜索元素。
这里有一些例子–