Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erklärung, wie Python das Beautiful Soup-Modul zur Suche nach Inhalten verwendet

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

高洛峰
高洛峰Original
2017-03-31 09:47:212789Durchsuche

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>

Wir können das ff6d136ddc5fdfeffaf53ff6ee95f185-Tag über die Methode find() abrufen, und standardmäßig erhalten wir das erste, das angezeigt wird. Dann holen Sie sich das Tag 25edfb22a4f469ecb59f1190150159c6. Standardmäßig erhalten Sie immer noch das Tag e388a4556c0f65e1904146cc1a846bee, 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

Die find()-Methode lautet wie folgt:


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

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 ff6d136ddc5fdfeffaf53ff6ee95f185-Tag können wir auch nach dem 25edfb22a4f469ecb59f1190150159c6-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

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;>

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>

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

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

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

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

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

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

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

使用 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() 方法来搜索上一个标签。

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!

Stellungnahme:
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