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
find()
abrufen, und standardmäßig erhalten wir das erste, das angezeigt wird. Dann holen Sie sich das Tag , und überprüfen Sie, ob Sie das erste Tag erhalten.
from bs4 import BeautifulSoup with open('search.html','r') as filename: soup = BeautifulSoup(filename,'lxml') first_ul_entries = soup.find('ul') 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
tag_li = soup.find('li') # 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='plants') print type(search_for_text) <class 'bs4.element.NavigableString'>
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,'lxml') 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='primaryconsumers') 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,'lxml') customsoup.find(data-custom="custom") # SyntaxError: keyword can'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={'data-custom':'custom'}) 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={'class':'producerlist'}) 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('id') and tag.get('id') == 'producers' 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,'lxml') 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_='tertiaryconsumerlist') 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_='primaryconsumerlist') print len(primaryconsumers) # 取父标签的第一个 primaryconsumer = primaryconsumers[0] # 搜索所有 ul 的父标签 parent_ul = primaryconsumer.find_parents('ul') print len(parent_ul) # 结果将包含父标签的所有内容 print parent_ul print # 搜索,取第一个出现的父标签.有两种操作 immediateprimary_consumer_parent = primaryconsumer.find_parent() # immediateprimary_consumer_parent = primaryconsumer.find_parent('ul') print immediateprimary_consumer_parent
搜索同级标签
Beautiful Soup 还提供了搜索同级标签的功能。
使用函数 find_next_siblings()
函数能够搜索同一级的下一个所有标签,而 find_next_sibling()
函数能够搜索同一级的下一个标签。
producers = soup.find(id='producers') 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!