📜  Beautiful Soup-搜索树

📅  最后修改于: 2020-11-09 14:27:10             🧑  作者: Mango


 

有许多Beautifulsoup方法,使我们可以搜索解析树。最常用和最常用的两个方法是find()和find_all()。

在讨论find()和find_all()之前,让我们看一些可以传入这些方法的不同过滤器的示例。

过滤器种类

我们可以将不同的过滤器传递给这些方法,对这些过滤器的理解至关重要,因为这些过滤器会在整个搜索API中一次又一次地使用。我们可以根据标签名称,属性,字符串文本或混合使用这些过滤器。

字符串

字符串是最简单的过滤器类型之一。将字符串传递给search方法和Beautifulsoup将与该精确字符串进行匹配。

下面的代码将找到文档中的所有

标记-

>>> markup = BeautifulSoup('

Top Three

Programming Languages are:

Java, Python, Cplusplus

') >>> markup.find_all('p') [

Top Three

,

,

Java, Python, Cplusplus

]

正则表达式

您可以找到以给定字符串/ tag开头的所有标签。在此之前,我们需要导入re模块以使用正则表达式。

>>> import re
>>> markup = BeautifulSoup('

Top Three

Programming Languages are:

Java, Python, Cplusplus

') >>> >>> markup.find_all(re.compile('^p')) [

Top Three

,

,
Programming Languages are:
,

Java, Python, Cplusplus

]

清单

您可以通过提供列表来传递多个标签来查找。下面的代码找到所有

标签-

>>> markup.find_all(['pre', 'b'])
[
Programming Languages are:
, Java, Python, Cplusplus]

真正

True将返回它可以找到的所有标签,但没有字符串本身-

>>> markup.find_all(True)
[

Top Three

Programming Languages are:

Java, Python, Cplusplus

,

Top Three

 Programming Languages are:

Java, Python, Cplusplus

,

Top Three

,

,
Programming Languages are:
,

Java, Python, Cplusplus

, Java, Python, Cplusplus]

只返回上述汤中的标签-

>>> for tag in markup.find_all(True):
(tag.name)
'html'
'body'
'p'
'p'
'pre'
'p'
'b'

找到所有()

您可以使用find_all从页面响应中提取所有出现的特定标签,如下所示:

句法

find_all(name, attrs, recursive, string, limit, **kwargs)

让我们从IMDB-“最受好评的电影”中提取一些有趣的数据。

>>> url="https://www.imdb.com/chart/top/?ref_=nv_mv_250"
>>> content = requests.get(url)
>>> soup = BeautifulSoup(content.text, 'html.parser')
#Extract title Page
>>> print(soup.find('title'))
IMDb Top 250 - IMDb

#Extracting main heading
>>> for heading in soup.find_all('h1'):
   print(heading.text)
Top Rated Movies

#Extracting sub-heading
>>> for heading in soup.find_all('h3'):
   print(heading.text)
   
IMDb Charts
You Have Seen
   IMDb Charts
   Top India Charts
Top Rated Movies by Genre
Recently Viewed

从上面可以看到,find_all将为我们提供所有与我们定义的搜索条件相匹配的项目。我们可以与find_all()一起使用的所有过滤器都可以与find()和其他搜索方法(例如find_parents()或find_siblings())一起使用。

找()

上面我们已经看到,find_all()用于扫描整个文档以查找所有内容,但是某些情况下,要求仅查找一个结果。如果您知道文档仅包含一个标记,则浪费时间搜索整个文档。一种方法是每次以limit = 1调用find_all(),否则我们可以使用find()方法执行相同的操作-

句法

find(name, attrs, recursive, string, **kwargs)

所以下面两种不同的方法给出相同的输出-

>>> soup.find_all('title',limit=1)
[IMDb Top 250 - IMDb]
>>>
>>> soup.find('title')
IMDb Top 250 - IMDb

在上面的输出中,我们可以看到find_all()方法返回包含单个项目的列表,而find()方法返回单个结果。

find()和find_all()方法之间的另一个区别是-

>>> soup.find_all('h2')
[]
>>>
>>> soup.find('h2')

如果汤.find_all()方法找不到任何内容,则返回空列表,而find()返回无。

find_parents()和find_parent()

与遍历树,查找标记的后代的find_all()和find()方法不同,find_parents()和find_parents Methods()的作用相反,它们向上遍历树并查看标记(或字符串的)父对象。

句法

find_parents(name, attrs, string, limit, **kwargs)
find_parent(name, attrs, string, **kwargs)

>>> a_string = soup.find(string="The Godfather")
>>> a_string
'The Godfather'
>>> a_string.find_parents('a')
[The Godfather]
>>> a_string.find_parent('a')
The Godfather
>>> a_string.find_parent('tr')








 The Godfather
 

2.
The Godfather
(1972)


9.1


  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 0
NOT YET RELEASED
Seen
>>> >>> a_string.find_parents('td') [ 2. The Godfather (1972) ]

还有八种类似的方法-

find_next_siblings(name, attrs, string, limit, **kwargs)
find_next_sibling(name, attrs, string, **kwargs)

find_previous_siblings(name, attrs, string, limit, **kwargs)
find_previous_sibling(name, attrs, string, **kwargs)

find_all_next(name, attrs, string, limit, **kwargs)
find_next(name, attrs, string, **kwargs)

find_all_previous(name, attrs, string, limit, **kwargs)
find_previous(name, attrs, string, **kwargs)

哪里,

find_next_siblings()find_next_sibling()方法将遍历当前元素之后的所有元素同级。

find_previous_siblings()find_previous_sibling()方法将遍历当前元素之前的所有同级对象。

find_all_next()find_next()方法将遍历当前元素之后的所有标记和字符串。

find_all_previousfind_previous()方法将遍历当前元素之前的所有标记和字符串。

CSS选择器

BeautifulSoup库支持最常用的CSS选择器。您可以在select()方法的帮助下使用CSS选择器搜索元素。

这是一些例子-

>>> soup.select('title')
[IMDb Top 250 - IMDb, IMDb Top Rated Movies]
>>>
>>> soup.select("p:nth-of-type(1)")
[

The Top Rated Movie list only includes theatrical features.

,

class="imdb-footer__copyright _2-iNNCFskmr4l2OFN2DRsf">© 1990-2019 by IMDb.com, Inc.

] >>> len(soup.select("p:nth-of-type(1)")) 2 >>> len(soup.select("a")) 609 >>> len(soup.select("p")) 2 >>> soup.select("html head title") [IMDb Top 250 - IMDb, IMDb Top Rated Movies] >>> soup.select("head > title") [IMDb Top 250 - IMDb] #print HTML code of the tenth li elemnet >>> soup.select("li:nth-of-type(10)") []