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