Изучая Python, я пытался организовать различные способы получения определенных тегов из html-документов.
Пример HTML-кода
Предполагая, что существует следующий HTML-документ, давайте посмотрим, как последовательно анализировать определенные теги с помощью модуля BeautifulSoup.
from bs4 import BeautifulSoup
html = """
<!DOCTYPE html>
<html>
<head></head>
<body>
<span class='test1'>Content1</span>
<div class='test1'>Content2</div>
<div class='test1' id='target' name='sangminem'>Goal</div>
<div class='test2'>Content3</div>
</body>
</html>
"""
soup = BeautifulSoup(html, "html.parser")
Цель - тег ниже.
<div class='test1' id='target' name='sangminem'>Goal</div>
Используйте метод найти ()
print(soup.find('div',id='target')) #tag, id
print(soup.find('div',attrs={'id':'target'})) #tag, id as attribute value
print(soup.find('div',attrs={'name':'sangminem'})) #tag, name as attribute value
print(soup.find(attrs={'name':'sangminem'})) #name as attribute value
print(soup.find(attrs={'id':'target'})) #id as attribute value
Вот результат.
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
Используйте метод find_all()
print(soup.find_all('div')[1]) #tag
print(soup.find_all('div',class_=['test1'])[1]) #tag, class
print(soup.find_all('div',id='target')[0]) #tag, id
print(soup.find_all('div',attrs={'class':'test1'})[1]) #tag, class as attribute value
print(soup.find_all('div',attrs={'id':'target'})[0]) #tag, id as attribute value
print(soup.find_all('div',attrs={'name':'sangminem'})[0]) #name as attribute value
print(soup.find_all(class_=['test1'])[2]) #class
print(soup.find_all(id='target')[0]) #id
print(soup.find_all(attrs={'class':'test1'})[2]) #class as attribute value
print(soup.find_all(attrs={'id':'target'})[0]) #id as attribute value
print(soup.find_all(attrs={'name':'sangminem'})[0]) #name as attribute value
Вот результат.
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
Используйте метод select_one()
print(soup.select_one('div.test1#target')) #tag, class, id
print(soup.select_one('div#target')) #tag, id
print(soup.select_one('.test1#target')) #class, id
print(soup.select_one('#target')) #id
Вот результат.
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
Используйте метод выбора ()
print(soup.select('.test1')[2]) #class
print(soup.select('div.test1')[1]) #tag, class
print(soup.select('div.test1#target')[0]) #tag, class, id
print(soup.select('div#target')[0]) #tag, id
print(soup.select('.test1#target')[0]) #class, id
print(soup.select('#target')[0]) #id
Вот результат.
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
Метод find() и метод select_one() получают один результат.
Если есть несколько результатов, удовлетворяющих условию, извлекается только первое значение.
Методы find_all() и select() получают все результаты, удовлетворяющие условию, в виде массива.
Поэтому, чтобы в итоге получить нужное значение, нельзя опускать индекс массива.
Если трудно решить, какой из них использовать из-за различных методов, мы рекомендуем использовать метод select().
Он прост в использовании и на самом деле анализирует быстрее.