» n» и другие избыточные данные включаются в список при использовании .contents в beautifulsoup»

#python #beautifulsoup

#python #beautifulsoup

Вопрос:

 <div class="pv-entity__degree-info"><h3 class="pv-entity__school-name t-16 t-black t-bold">Universitatea de Medicină și Farmacie „Grigore T. Popa” din Iași</h3>
<p class="pv-entity__secondary-title pv-entity__degree-name t-14 t-black t-normal">
<span class="visually-hidden">Degree Name</span>
<span class="pv-entity__comma-item">MD</span>
</p>
<p class="pv-entity__secondary-title pv-entity__fos t-14 t-black t-normal">
<span class="visually-hidden">Field Of Study</span>
<span class="pv-entity__comma-item">Merdicine</span>
</p>
<!-- --> </div>
  

я получал .contents в этом теге div.Мы ясно видим, что у него есть 3 дочерних тега.Но .contents выдает список длиной 8, когда он должен быть длиной 3.Почему?

Ответ №1:

BeautifulSoup включает теги и навигационные строки в .contents . Если вам нужны только теги, вы можете использовать .find_all() с параметром recursive=False :

 from bs4 import BeautifulSoup


txt = '''<div class="pv-entity__degree-info"><h3 class="pv-entity__school-name t-16 t-black t-bold">Universitatea de Medicină și Farmacie „Grigore T. Popa” din Iași</h3>
<p class="pv-entity__secondary-title pv-entity__degree-name t-14 t-black t-normal">
<span class="visually-hidden">Degree Name</span>
<span class="pv-entity__comma-item">MD</span>
</p>
<p class="pv-entity__secondary-title pv-entity__fos t-14 t-black t-normal">
<span class="visually-hidden">Field Of Study</span>
<span class="pv-entity__comma-item">Merdicine</span>
</p>
<!-- --> </div>'''

soup = BeautifulSoup(txt, 'html.parser')
print(len(soup.div.find_all(recursive=False)))
  

С принтами:

 3
  

Комментарии:

1. уточнение.plz. 1 .. Параметр «recursive» просто исключит дочерние элементы div или он также исключит прямых дочерних элементов, если у них одинаковый тег? потому что при запуске в цикле я не могу быть уверен, что у более чем одного дочернего элемента одинаковый тег. 2. рекурсивный параметр исключает потомков div и выдает результаты только на основе прямых дочерних элементов, как это работает с .contents или .children, верно?

2. @NipunTulsyan Да, recursive=False даст вам одного прямого потомка (дочернего элемента) элемента. Без этого find_all() вернутся все теги, подтеги, подзаголовки и так далее.