Python が Beautiful Soup モジュールを使用してコンテンツを検索する方法の詳細な説明

高洛峰
リリース: 2017-03-31 09:47:21
オリジナル
2824 人が閲覧しました

この記事では主にPythonのBeautiful Soupモジュールの検索メソッド機能について紹介します。 メソッド さまざまなタイプのフィルタリング パラメータにより、さまざまなフィルタリングを実行し、目的の結果を得ることができます。この記事の紹介は非常に詳細であり、必要な友人は以下を参照してください。

はじめに

Beautiful Soup モジュールの検索機能を使用して、タグ名、タグ属性、文書テキスト、正規表現に基づいて検索します。

検索方法

Beautiful Soupの組み込み検索方法は次のとおりです:

  • find()

  • find_all()

  • find_parent()

  • find_parents()

  • find_next_siblings()

  • 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>
ログイン後にコピー

find() メソッドを通じて

    タグを取得できます。デフォルトでは、最初に表示されるタグを取得します。次に、
  • タグを取得します。デフォルトでは、最初に表示されるタグを取得し、コンテンツを出力して最初のタグを取得したかどうかを確認します。 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
      ログイン後にコピー

      find() 方法具体如下:


      find(name,attrs,recursive,text,**kwargs)
      ログイン後にコピー

      正如上代码所示,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
        ログイン後にコピー

        搜索文本

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


        search_for_text = soup.find(text=&#39;plants&#39;)
        print type(search_for_text)
        <class &#39;bs4.element.NavigableString&#39;>
        ログイン後にコピー

        返回的结果也是 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>
        ログイン後にコピー

        可以看到 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
        ログイン後にコピー

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

        根据标签属性值搜索

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


        search_for_attribute = soup.find(id=&#39;primaryconsumers&#39;)
        print search_for_attribute.li.p.string
        ログイン後にコピー

        根据标签属性值来搜索对大多数属性都是可用的,例如: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
        ログイン後にコピー

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


        using_attrs = customsoup.find(attrs={&#39;data-custom&#39;:&#39;custom&#39;})
        print using_attrs
        ログイン後にコピー

        基于 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
        ログイン後にコピー

        使用自定义的函数搜索

        可以给 find()

        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
        ログイン後にコピー

        find() メソッドは次のとおりです:


        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
        ログイン後にコピー
        ログイン後にコピー

        上記のコードに示すように、find() メソッドは 5 つのパラメータを受け入れます: name、attrs、recursive、テキストと * *kwargs。名前、属性、テキスト パラメータはすべて、find() メソッドのフィルタとして機能し、一致結果の精度を向上させることができます。

        タグの検索

        上記のコードの
          タグの検索に加えて、
        • タグも検索でき、返される結果には最初に表示された一致するコンテンツも返されます。 🎜🎜🎜🎜
          # 搜索所有 class 属性等于 tertiaryconsumerlist 的标签。
          all_tertiaryconsumers = soup.find_all(class_=&#39;tertiaryconsumerlist&#39;)
          print type(all_tertiaryconsumers)
          for tertiaryconsumers in all_tertiaryconsumers:
           print tertiaryconsumers.p.string
          ログイン後にコピー
          ログイン後にコピー
          🎜🎜テキストの検索🎜🎜🎜 テキストのコンテンツのみに基づいて検索したい場合は、テキストパラメータを渡すだけです: 🎜🎜🎜🎜
          find_all(name,attrs,recursive,text,limit,**kwargs)
          ログイン後にコピー
          ログイン後にコピー
          🎜 返される結果も NavigableString オブジェクトです。 🎜🎜🎜正規表現に基づいて🎜🎜🎜次のHTMLテキストコンテンツを検索🎜🎜🎜🎜
          # 搜索所有的 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
          ログイン後にコピー
          ログイン後にコピー
          🎜 abc@exampleのメールアドレスがどのタグにも含まれていないため、タグに基づいてメールアドレスを見つけることができないことがわかります。現時点では、正規表現を使用して照合できます。 🎜🎜🎜🎜
          # 搜索 父标签
          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
          ログイン後にコピー
          ログイン後にコピー
          🎜マッチングに正規表現を使用する場合、複数の一致がある場合は、最初の一致が最初に返されます。 🎜🎜🎜タグの属性値で検索🎜🎜🎜タグの属性値で検索できます: 🎜🎜🎜🎜
          producers = soup.find(id=&#39;producers&#39;)
          next_siblings = producers.find_next_siblings()
          print next_siblings
          ログイン後にコピー
          ログイン後にコピー
          🎜タグの属性値で検索は、ID、スタイル、タイトルなどのほとんどの属性で利用できます。 🎜🎜🎜しかし、次の 2 つの状況では異なります: 🎜🎜🎜🎜カスタム属性 🎜🎜🎜🎜 クラス ( class ) 属性 🎜🎜🎜🎜 属性値を直接使用して検索することはできなくなりましたが、使用する必要があります。 find() 関数に渡す attrs パラメータ。 🎜🎜🎜カスタム属性に基づいて検索🎜🎜🎜 HTML5 では、タグに属性を追加するなど、タグにカスタム属性を追加できます。 🎜🎜次のコードに示すように、ID を検索するような操作を続けると、Python 変数に - 記号を含めることはできません。 🎜🎜🎜🎜
          # 搜索下一级标签
          first_p = soup.p
          all_li_tags = first_p.find_all_next("li")
          print all_li_tags
          ログイン後にコピー
          ログイン後にコピー
          🎜このとき、attrs 属性値を使用して辞書タイプをパラメータとして渡して検索します。 🎜🎜🎜🎜rrreee🎜🎜 CSS のクラスに基づいて検索します 🎜🎜🎜 CSS クラス属性の場合、class in Python これはキーワードであるため、ラベル属性パラメータとして渡すことはできません。この場合、検索はカスタム属性と同様に実行されます。また、attrs 属性を使用して、照合用の辞書を渡します。 🎜🎜 attrs 属性の使用に加えて、class_ 属性を使用して渡すこともできます。これは class とは異なり、エラーは発生しません。 🎜🎜🎜🎜rrreee🎜🎜カスタム関数検索を使用する🎜🎜🎜 find() メソッドに関数を渡すと、関数で定義された条件に基づいて検索が実行されます。 🎜🎜🎜関数は true または false の値を返す必要があります。 🎜🎜🎜🎜rrreee🎜 このコードは、タグに特定の id 属性があるかどうか、およびその属性値がプロデューサーと等しいかどうかをチェックする is_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
          ログイン後にコピー
          ログイン後にコピー

          使用 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
          ログイン後にコピー
          ログイン後にコピー

          find_all() 方法为 :


          find_all(name,attrs,recursive,text,limit,**kwargs)
          ログイン後にコピー
          ログイン後にコピー

          它的参数和 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
          ログイン後にコピー
          ログイン後にコピー

          搜索相关标签

          一般情况下,我们可以使用 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
          ログイン後にコピー
          ログイン後にコピー

          搜索同级标签

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

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


          producers = soup.find(id=&#39;producers&#39;)
          next_siblings = producers.find_next_siblings()
          print next_siblings
          ログイン後にコピー
          ログイン後にコピー

          同样,也可以使用 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
          ログイン後にコピー
          ログイン後にコピー

          搜索上一个标签

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

          以上がPython が Beautiful Soup モジュールを使用してコンテンツを検索する方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!