Beautiful Soup搜索文档树

Beautiful Soup搜索文档树

Beautiful Soup搜索文档树

  HTML(超文本标记语言)由许多标签组成,我们需要提取的数据位于这些标签内。因此需要找到正确的标签来提取,可以在BeautifulSoup搜索方法的帮助下达到目的。

Beautiful-Soup搜索文档树

  上篇文章我们为你介绍Beautiful Soup遍历文档树,本文来介绍Beautiful Soup搜索解析树的方法。最常用的方法是:find()和 find_all(),也有其他类似的方法。因此,我们将专注于找() 和 find_all () 本文中的方法,在本章中,我们晓得博客将为你介绍Beautiful Soup搜索文档树。

过滤器种类

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

  以下是我们的 html 文档 ,基于这个文档,我们将尝试带您了解Beautiful Soup搜索文档树中的过滤器使用。

  推荐:Python循环

html_doc = """
<html><head><title>Beautiful Soup Tutorials</title></head>
<body>
<p class="title"><b>The Biggest Online Tutorials Library, It's all Free from www.pythonthree.com</b></p>
<p class="prog">Top 5 most used Programming Languages are:
<a href="https://www.example.com/java/java_overview.htm" class="prog" id="link1">Java</a>,
<a href="https://www.example.com/cprogramming/index.htm" class="prog" id="link2">C</a>,
<a href="https://www.example.com/python/index.htm" class="prog" id="link3">Python</a>,
<a href="https://www.example.com/javascript/javascript_overview.htm" class="prog" id="link4">JavaScript</a> and
<a href="https://www.example.com/ruby/index.htm" class="prog" id="link5">C</a>;
as per online survey.</p>
<p class="prog">Programming Languages</p>
"""

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')
字符串
Beautiful-Soup搜索文档-字符串

   Beautiful Soup搜索文档树-字符串,最简单的过滤器类型之一是字符串。将字符串传递给搜索方法,Beautifulsoup 将对该字符串执行匹配。下面的代码将找到文档中的所有 <p> 标签 -

>>> soup = BeautifulSoup(html_doc, 'html.parser')
>>> soup.find_all('p')
[<p class="title"><b>The Biggest Online Tutorials Library, It's all Free from www.pythonthree.com</b></p>, <p class="prog">Top 5 most used Programming Languages are:
<a class="prog" href="https://www.example.com/java/java_overview.htm" id="link1">Java</a>,
<a class="prog" href="https://www.example.com/cprogramming/index.htm" id="link2">C</a>,
<a class="prog" href="https://www.example.com/python/index.htm" id="link3">Python</a>,
<a class="prog" href="https://www.example.com/javascript/javascript_overview.htm" id="link4">JavaScript</a> and
<a class="prog" href="https://www.example.com/ruby/index.htm" id="link5">C</a>;
as per online survey.</p>, <p class="prog">Programming Languages</p>]
正则表达式
Beautiful-Soup搜索文档-正则表达式

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

>>> import re
>>> markup = BeautifulSoup('<p>Top Three</p><p><pre>Programming Languages are:</pre></p><p><b>Java, Python, Cplusplus</b></p>')
>>>
>>> markup.find_all(re.compile('^p'))
[<p>Top Three</p>, <p></p>, <pre>Programming Languages are:</pre>, <p><b>Java, Python, Cplusplus</b></p>]
列表

   Beautiful Soup搜索文档树 -列表,您可以通过提供列表来传递多个标签以进行查找。下面的代码找到所有 <b> 和 <pre> 标签 -

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

   Beautiful Soup搜索文档树 -Ture,True 将返回它可以找到的所有标签,但没有自己的字符串 -

>>> markup.find_all(True)
[<html><body><p>Top Three</p><p></p><pre>Programming Languages are:</pre>
<p><b>Java, Python, Cplusplus</b> </p> </body></html>, 
<body><p>Top Three</p><p></p><pre> Programming Languages are:</pre><p><b>Java, Python, Cplusplus</b></p>
</body>, 
<p>Top Three</p>, <p></p>, <pre>Programming Languages are:</pre>, <p><b>Java, Python, Cplusplus</b></p>, <b>Java, Python, Cplusplus</b>]

  仅返回上述Beautifulsoup中的标签 -

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

find_all()

Beautiful-Soup搜索文档-find语法

  您可以使用 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')

>>> print(soup.find('title'))
<title>IMDb</title>


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

>>> 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()。

  推荐:使用BeautifulSoup查询关键词谷歌搜索结果排名

find()

  find_all() 用于扫描整个文档以查找除某些内容之外的所有内容,要求只找到一个结果。如果您知道文档只包含一个 <body> 标签,那么搜索整个文档是浪费时间。一种方法是每次都使用 limit=1 调用 find_all() ,否则我们可以使用 find() 方法来做同样的事情 -语法

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

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

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

  在上面的输出中,我们可以看到 find_all() 方法返回一个包含单个项目的列表,而 find() 方法返回单个结果。 Beautiful Soup搜索文档树中的find() 和 find_all() 方法之间的另一个区别是 -

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

  如果soup.find_all() 方法找不到任何东西,它返回空列表,而find() 返回None。

find_parents() 和 find_parent()

  与遍历树的 find_all() 和 find() 方法不同,查看标签的后代, find_parents() 和 find_parents 方法() 做相反的事情,它们向上遍历树并查看标签(或字符串)的父母,语法

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

  还有其他八种类似的方法 -

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 选择器

   Beautiful Soup搜索文档树 -CSS 选择器,BeautifulSoup 库支持最常用的 CSS 选择器。您可以在 select() 方法的帮助下使用 CSS 选择器搜索元素。以下是一些示例 -

>>> soup.select('title')
[<title>IMDb Top 250 - IMDb</title>, <title>IMDb Top Rated Movies</title>]
>>>
>>> soup.select("p:nth-of-type(1)")
[<p>The Top Rated Movie list only includes theatrical features.</p>, <p> class="imdb-footer__copyright _2-iNNCFskmr4l2OFN2DRsf">© 1990-2019 by IMDb.com, Inc.</p>]
>>> len(soup.select("p:nth-of-type(1)"))
2
>>> len(soup.select("a"))
609
>>> len(soup.select("p"))
2

>>> soup.select("html head title")
[<title>IMDb Top 250 - IMDb</title>, <title>IMDb Top Rated Movies</title>]
>>> soup.select("head > title")
[<title>IMDb Top 250 - IMDb</title>]

#print HTML code of the tenth li elemnet
>>> soup.select("li:nth-of-type(10)")
[<li class="subnav_item_main">
<a href="/search/title?genres=film_noir&sort=user_rating,desc&title_type=feature&num_votes=25000,">Film-Noir
</a> </li>]

总结

  以上是晓得博客为你介绍的Beautiful Soup搜索文档树的全部内容, 希望对你的BeautifulSoup学习有所帮助,欢迎留言讨论。更多内容可参考官方文档

  推荐:Beautiful Soup教程

5/5 - (1 vote)

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注


Scroll to Top