Rumah > pembangunan bahagian belakang > Tutorial Python > 详解Python利用Beautiful Soup模块搜索内容方法

详解Python利用Beautiful Soup模块搜索内容方法

高洛峰
Lepaskan: 2017-03-31 09:47:21
asal
2966 orang telah melayarinya

这篇文章主要给大家介绍了python中 Beautiful Soup 模块的搜索方法函数。 方法不同类型的过滤参数能够进行不同的过滤,得到想要的结果。文中介绍的非常详细,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。

前言

我们将利用 Beautiful Soup 模块的搜索功能,根据标签名称、标签属性、文档文本和正则表达式来搜索。

搜索方法

Beautiful Soup 内建的搜索方法如下:

  • find()

  • find_all()

  • find_parent()

  • find_parents()

  • find_next_sibling()

  • find_next_siblings()

  • find_previous_sibling()

  • find_previous_siblings()

  • find_previous()

  • find_all_previous()

  • find_next()

  • find_all_next()

使用 find() 方法搜索

首先还是需要建立一个 HTML 文件用来做测试。


<html>
<body>
<p class="ecopyramid">
 <ul id="producers">
 <li class="producerlist">
  <p class="name">plants</p>
  <p class="number">100000</p>
 </li>
 <li class="producerlist">
  <p class="name">algae</p>
  <p class="number">100000</p>
 </li>
 </ul>
 <ul id="primaryconsumers">
 <li class="primaryconsumerlist">
  <p class="name">deer</p>
  <p class="number">1000</p>
 </li>
 <li class="primaryconsumerlist">
  <p class="name">rabbit</p>
  <p class="number">2000</p>
 </li>
 </ul>
 <ul id="secondaryconsumers">
 <li class="secondaryconsumerlist">
  <p class="name">fox</p>
  <p class="number">100</p>
 </li>
 <li class="secondaryconsumerlist">
  <p class="name">bear</p>
  <p class="number">100</p>
 </li>
 </ul>
 <ul id="tertiaryconsumers">
 <li class="tertiaryconsumerlist">
  <p class="name">lion</p>
  <p class="number">80</p>
 </li>
 <li class="tertiaryconsumerlist">
  <p class="name">tiger</p>
  <p class="number">50</p>
 </li>
 </ul>
</p>
</body>
</html>
Salin selepas log masuk

我们可以通过 find() 方法来获得

    标签,默认情况下会得到第一个出现的。接着再获取
  • 标签,默认情况下还是会得到第一个出现的,接着获得

    标签,通过输出内容来验证是否获取了第一个出现的标签。


    from bs4 import BeautifulSoup
    with open(&#39;search.html&#39;,&#39;r&#39;) as filename:
     soup = BeautifulSoup(filename,&#39;lxml&#39;)
    first_ul_entries = soup.find(&#39;ul&#39;)
    print first_ul_entries.li.p.string
    Salin selepas log masuk

    find() 方法具体如下:


    find(name,attrs,recursive,text,**kwargs)
    Salin selepas log masuk

    正如上代码所示,find() 方法接受五个参数:name、attrs、recursive、text 和 **kwargs 。name 、attrs 和 text 参数都可以在 find() 方法充当过滤器,提高匹配结果的精确度。

    搜索标签

    除了上面代码的搜索

      标签外,我们还可以搜索
    • 标签,返回结果也是返回出现的第一个匹配内容。


      tag_li = soup.find(&#39;li&#39;)
      # tag_li = soup.find(name = "li")
      print type(tag_li)
      print tag_li.p.string
      Salin selepas log masuk

      搜索文本

      如果我们只想根据文本内容来搜索的话,我们可以只传入文本参数 :


      search_for_text = soup.find(text=&#39;plants&#39;)
      print type(search_for_text)
      <class &#39;bs4.element.NavigableString&#39;>
      Salin selepas log masuk

      返回的结果也是 NavigableString 对象 。

      根据正则表达式搜索

      如下的一段 HTML 文本内容


      <p>The below HTML has the information that has email ids.</p>
       abc@example.com 
      <p>xyz@example.com</p> 
       <span>foo@example.com</span>
      Salin selepas log masuk

      可以看到 abc@example 邮件地址并没有包括在任何标签内,这样就不能根据标签来找到邮件地址了。这个时候,我们可以使用正则表达式来进行匹配。


      email_id_example = """
       <p>The below HTML has the information that has email ids.</p>
       abc@example.com
       <p>xyz@example.com</p>
       <span>foo@example.com</span>
       """
      email_soup = BeautifulSoup(email_id_example,&#39;lxml&#39;)
      print email_soup
      # pattern = "\w+@\w+\.\w+"
      emailid_regexp = re.compile("\w+@\w+\.\w+")
      first_email_id = email_soup.find(text=emailid_regexp)
      print first_email_id
      Salin selepas log masuk

      在使用正则表达式进行匹配时,如果有多个匹配项,也是先返回第一个。

      根据标签属性值搜索

      可以通过标签的属性值来搜索:


      search_for_attribute = soup.find(id=&#39;primaryconsumers&#39;)
      print search_for_attribute.li.p.string
      Salin selepas log masuk

      根据标签属性值来搜索对大多数属性都是可用的,例如:id、style 和 title 。

      但是对以下两种情况会有不同:

      • 自定义属性

      • 类 ( class ) 属性

      我们不能再直接使用属性值来搜索了,而是得使用 attrs 参数来传递给 find() 函数。

      根据自定义属性来搜索

      在 HTML5 中是可以给标签添加自定义属性的,例如给标签添加 属性。

      如下代码所示,如果我们再像搜索 id 那样进行操作的话,会报错的,Python 的变量不能包括 - 符号。


      customattr = """
       <p data-custom="custom">custom attribute example</p>
         """
      customsoup = BeautifulSoup(customattr,&#39;lxml&#39;)
      customsoup.find(data-custom="custom")
      # SyntaxError: keyword can&#39;t be an expression
      Salin selepas log masuk

      这个时候使用 attrs 属性值来传递一个字典类型作为参数进行搜索:


      using_attrs = customsoup.find(attrs={&#39;data-custom&#39;:&#39;custom&#39;})
      print using_attrs
      Salin selepas log masuk

      基于 CSS 中的 类 进行搜索

      对于 CSS 的类属性,由于在 Python 中 class 是个关键字,所以是不能当做标签属性参数传递的,这种情况下,就和自定义属性一样进行搜索。也是使用 attrs 属性,传递一个字典进行匹配 。

      除了使用 attrs 属性之外,还可以使用 class_ 属性进行传递,这样与 class 区别开了,也不会导致错误。


      css_class = soup.find(attrs={&#39;class&#39;:&#39;producerlist&#39;})
      css_class2 = soup.find(class_ = "producerlist")
      print css_class
      print css_class2
      Salin selepas log masuk

      使用自定义的函数搜索

      可以给 find() 方法传递一个函数,这样就会根据函数定义的条件进行搜索。

      函数应该返回 true 或者是 false 值。


      def is_producers(tag):
       return tag.has_attr(&#39;id&#39;) and tag.get(&#39;id&#39;) == &#39;producers&#39;
      tag_producers = soup.find(is_producers)
      print tag_producers.li.p.string
      Salin selepas log masuk

      代码中定义了一个 is_producers 函数,它将检查标签是否具体 id 属性以及属性值是否等于 producers,如果符合条件则返回 true ,否则返回 false 。

      联合使用各种搜索方法

      Beautiful Soup 提供了各种搜索方法,同样,我们也可以联合使用这些方法来进行匹配,提高搜索的准确度。


      combine_html = """
       <p class="identical">
        Example of p tag with class identical
       </p>
       <p class="identical">
        Example of p tag with class identical
       <p>
       """
      combine_soup = BeautifulSoup(combine_html,&#39;lxml&#39;)
      identical_p = combine_soup.find("p",class_="identical")
      print identical_p
      Salin selepas log masuk

      使用 find_all() 方法搜索

      使用 find() 方法会从搜索结果中返回第一个匹配的内容,而 find_all() 方法则会返回所有匹配的项。

      find() 方法中用到的过滤项,同样可以用在 find_all() 方法中。事实上,它们可以用到任何搜索方法中,例如:find_parents()find_siblings() 中 。


      # 搜索所有 class 属性等于 tertiaryconsumerlist 的标签。
      all_tertiaryconsumers = soup.find_all(class_=&#39;tertiaryconsumerlist&#39;)
      print type(all_tertiaryconsumers)
      for tertiaryconsumers in all_tertiaryconsumers:
       print tertiaryconsumers.p.string
      Salin selepas log masuk

      find_all() 方法为 :


      find_all(name,attrs,recursive,text,limit,**kwargs)
      Salin selepas log masuk

      它的参数和 find() 方法有些类似,多个了 limit 参数。limit 参数是用来限制结果数量的。而 find() 方法的 limit 就是 1 了。

      同时,我们也能传递一个字符串列表的参数来搜索标签、标签属性值、自定义属性值和 CSS 类。


      # 搜索所有的 p 和 li 标签
      p_li_tags = soup.find_all(["p","li"])
      print p_li_tags
      print
      # 搜索所有类属性是 producerlist 和 primaryconsumerlist 的标签
      all_css_class = soup.find_all(class_=["producerlist","primaryconsumerlist"])
      print all_css_class
      print
      Salin selepas log masuk

      搜索相关标签

      一般情况下,我们可以使用 find()find_all() 方法来搜索指定的标签,同时也能搜索其他与这些标签相关的感兴趣的标签。

      搜索父标签

      可以使用 find_parent() 或者 find_parents() 方法来搜索标签的父标签。

      find_parent() 方法将返回第一个匹配的内容,而 find_parents() 将返回所有匹配的内容,这一点与 find() find_all() 方法类似。


      # 搜索 父标签
      primaryconsumers = soup.find_all(class_=&#39;primaryconsumerlist&#39;)
      print len(primaryconsumers)
      # 取父标签的第一个
      primaryconsumer = primaryconsumers[0]
      # 搜索所有 ul 的父标签
      parent_ul = primaryconsumer.find_parents(&#39;ul&#39;)
      print len(parent_ul)
      # 结果将包含父标签的所有内容
      print parent_ul
      print
      # 搜索,取第一个出现的父标签.有两种操作
      immediateprimary_consumer_parent = primaryconsumer.find_parent()
      # immediateprimary_consumer_parent = primaryconsumer.find_parent(&#39;ul&#39;)
      print immediateprimary_consumer_parent
      Salin selepas log masuk

      搜索同级标签

      Beautiful Soup 还提供了搜索同级标签的功能。

      使用函数 find_next_siblings() 函数能够搜索同一级的下一个所有标签,而 find_next_sibling() 函数能够搜索同一级的下一个标签。


      producers = soup.find(id=&#39;producers&#39;)
      next_siblings = producers.find_next_siblings()
      print next_siblings
      Salin selepas log masuk

      同样,也可以使用 find_previous_siblings() find_previous_sibling() 方法来搜索上一个同级的标签。

      搜索下一个标签

      使用 find_next() 方法将搜索下一个标签中第一个出现的,而 find_next_all() 将会返回所有下级的标签项。


      # 搜索下一级标签
      first_p = soup.p
      all_li_tags = first_p.find_all_next("li")
      print all_li_tags
      Salin selepas log masuk

      搜索上一个标签

      与搜索下一个标签类似,使用 find_previous()find_all_previous() 方法来搜索上一个标签。

      Atas ialah kandungan terperinci 详解Python利用Beautiful Soup模块搜索内容方法. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan