Ausführliche Erklärung, wie Python das Beautiful Soup-Modul zur Suche nach Inhalten verwendet

高洛峰
Freigeben: 2017-03-31 09:47:21
Original
2816 Leute haben es durchsucht

Dieser Artikel führt Sie hauptsächlich in die Suchmethodenfunktion des Beautiful Soup-Moduls in Python ein. Methoden Verschiedene Arten von Filterparametern können unterschiedliche Filterungen durchführen und die gewünschten Ergebnisse erzielen. Die Einführung im Artikel ist sehr detailliert und hat einen gewissen Referenzwert für alle Freunde, die sie brauchen, können einen Blick darauf werfen.

Vorwort

Wir werden die Suchfunktion des Beautiful Soup-Moduls verwenden, um basierend auf Tag-Namen, Tag-Attributen, Dokumenttext und regulären Tags zu suchen Ausdrücke.

Suchmethode

Die integrierte Suchmethode von Beautiful Soup lautet wie folgt:

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

Verwenden Sie die Methode find(), um nach zu suchen

Zuerst müssen Sie noch eine HTML-Datei zum Testen erstellen.


<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>
Nach dem Login kopieren

Wir können das

    -Tag über die Methode find() abrufen, und standardmäßig erhalten wir das erste, das angezeigt wird. Dann holen Sie sich das Tag
  • . Standardmäßig erhalten Sie immer noch das Tag

    , und überprüfen Sie, ob Sie das erste Tag erhalten.


    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
    Nach dem Login kopieren

    Die find()-Methode lautet wie folgt:


    find(name,attrs,recursive,text,**kwargs)
    Nach dem Login kopieren

    Wie oben gezeigt Code, find() Die Methode akzeptiert fünf Parameter: Name, Attrs, Recursive, Text und **kwargs. Der Name, die Attribute und die Textparameter können alle als Filter in der Methode find() dienen, um die Genauigkeit der Übereinstimmungsergebnisse zu verbessern.

    Nach Tags suchen

    Zusätzlich zur Suche nach dem

      -Tag können wir auch nach dem
    • -Tag suchen Das zurückgegebene Ergebnis ist auch das erste, das angezeigt wird.


      tag_li = soup.find(&#39;li&#39;)
      # tag_li = soup.find(name = "li")
      print type(tag_li)
      print tag_li.p.string
      Nach dem Login kopieren

      Text suchen

      Wenn wir nur anhand des Textinhalts suchen möchten, können wir nur den Text übergeben Parameter:


      search_for_text = soup.find(text=&#39;plants&#39;)
      print type(search_for_text)
      <class &#39;bs4.element.NavigableString&#39;>
      Nach dem Login kopieren

      Das zurückgegebene Ergebnis ist ebenfalls ein NavigableString-Objekt.

      Suchen Sie

      nach dem regulären Ausdruck und Sie können den folgenden HTML-Textinhalt sehen:


      <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>
      Nach dem Login kopieren

      Die E-Mail-Adresse „abc@example“ ist in keinem Tag enthalten, sodass die E-Mail-Adresse anhand der Tags nicht gefunden werden kann. Zu diesem Zeitpunkt können wir reguläre Ausdrücke zum Abgleichen verwenden.


      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
      Nach dem Login kopieren

      Wenn beim Abgleich reguläre Ausdrücke verwendet werden und mehrere übereinstimmende Elemente vorhanden sind, wird das erste zuerst zurückgegeben.

      Suche nach Tag-Attributwert

      Sie können nach Tag-Attributwert suchen:


      search_for_attribute = soup.find(id=&#39;primaryconsumers&#39;)
      print search_for_attribute.li.p.string
      Nach dem Login kopieren

      Suche Basierend auf Tag-Attributwerten ist für die meisten Attribute wie ID, Stil und Titel verfügbar.

      In den folgenden beiden Situationen wird es jedoch Unterschiede geben:

      • Benutzerdefiniertes Attribut

      • Klasse ( Klasse ) Attribute

      Wir können nicht mehr direkt anhand von Attributwerten suchen, sondern müssen den Parameter attrs verwenden, um ihn an die Funktion find() zu übergeben.

      Suche basierend auf benutzerdefinierten Attributen

      In HTML5 können Sie benutzerdefinierte Attribute zu Tags hinzufügen, beispielsweise das Hinzufügen von Attributen zu Tags.

      Wie im folgenden Code gezeigt, wird ein Fehler gemeldet, wenn wir den gleichen Vorgang wie bei der Suche nach der ID ausführen. Python-Variablen dürfen das Symbol „-“ nicht enthalten.


      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
      Nach dem Login kopieren

      Verwenden Sie zu diesem Zeitpunkt den attrs-Attributwert, um einen Wörterbuchtyp als Parameter für die Suche zu übergeben:


      using_attrs = customsoup.find(attrs={&#39;data-custom&#39;:&#39;custom&#39;})
      print using_attrs
      Nach dem Login kopieren

      Suche basierend auf Klassen in CSS

      Da es sich bei CSS-Klassenattributen um ein Schlüsselwort in Python handelt, kann es in diesem Fall nicht als Label-Attributparameter übergeben werden , suchen Sie genau wie benutzerdefinierte Eigenschaften. Verwenden Sie außerdem das Attribut attrs, um ein Wörterbuch für den Abgleich zu übergeben.

      Zusätzlich zur Verwendung des Attributs attrs können Sie zum Übergeben auch das Attribut class_ verwenden, das sich von class unterscheidet und keine Fehler verursacht.


      css_class = soup.find(attrs={&#39;class&#39;:&#39;producerlist&#39;})
      css_class2 = soup.find(class_ = "producerlist")
      print css_class
      print css_class2
      Nach dem Login kopieren

      Verwenden Sie eine benutzerdefinierte Funktion zum Suchen

      Sie können eine Funktion an die find() -Methode übergeben, damit Die Suche erfolgt basierend auf der Suche basierend auf den von der Funktion definierten Bedingungen.

      Die Funktion sollte einen wahren oder falschen Wert zurückgeben.


      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
      Nach dem Login kopieren

      Der Code definiert eine is_producers-Funktion, die prüft, ob das Tag ein bestimmtes ID-Attribut hat und ob der Attributwert mit den Produzenten übereinstimmt erfüllt ist, wird „true“ zurückgegeben, andernfalls wird „false“ zurückgegeben.

      Verwenden Sie verschiedene Suchmethoden zusammen

      Beautiful Soup bietet verschiedene Suchmethoden. Ebenso können wir diese Methoden auch gemeinsam verwenden, um einen Abgleich durchzuführen und die Genauigkeit der Suche zu verbessern. Ausgeben.


      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
      Nach dem Login kopieren

      使用 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
      Nach dem Login kopieren

      find_all() 方法为 :


      find_all(name,attrs,recursive,text,limit,**kwargs)
      Nach dem Login kopieren

      它的参数和 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
      Nach dem Login kopieren

      搜索相关标签

      一般情况下,我们可以使用 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
      Nach dem Login kopieren

      搜索同级标签

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

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


      producers = soup.find(id=&#39;producers&#39;)
      next_siblings = producers.find_next_siblings()
      print next_siblings
      Nach dem Login kopieren

      同样,也可以使用 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
      Nach dem Login kopieren

      搜索上一个标签

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

      Das obige ist der detaillierte Inhalt vonAusführliche Erklärung, wie Python das Beautiful Soup-Modul zur Suche nach Inhalten verwendet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!