Хобрук: Ваш путь к мастерству в программировании

Beautiful Soup - игнорировать дочерние div с тем же именем, что и родительский div

HTML структурирован следующим образом:

  <div class="my_class">
       <div>important text</div>
       <div class="my_class">
            <div>not important</div>
       </div>
   </div>
   <div class="my_class">
       <div>important text</div>
       <div class="my_class">
            <div>not important</div>
       </div>
   </div>
   ...

По сути, есть много div с тем же именем, что и их дочерние div, и, в конечном счете, я хочу найти «важный текст», который находится только под разделом partent.

Когда я пытаюсь найти все div с class="my_class", я, очевидно, получаю и родителей, и детей. Как я могу получить только родительские div?

Вот мой код для получения всех div с class = "my_class" и поиска важного текста:

my_div_list = soup.find_all('div', attrs={'class': 'my_class'})
for my_div in my_div_list:
    text_item = my_div.find('div') # to get to the div that contains the important text
    print(text_item.getText())

Очевидно, что выход:

important text
not important
important text
not important
...

Когда я хочу:

 important text
 important text
 ...
25.09.2019

Ответы:


1

Из документации findall():

recursive — это логический аргумент (по умолчанию — True), который сообщает Beautiful Soup, следует ли пройти весь путь вниз по дереву синтаксического анализа или рассматривать только непосредственные дочерние элементы тега или объекта синтаксического анализатора.

Итак, учитывая, что первый уровень div находится, например, под тегами <head> и <body>, вы можете установить

soup.html.body.find_all('div', attrs={'class': 'my_class'}, 
recursive=False)

Выход:

 ['important text', 'important text']
25.09.2019
  • Благодарность! Мне пришлось немного отредактировать, чтобы заставить его работать для меня (мой список div находился под другим div, поэтому я сделал sup.find(upper div).find_all(divs). Для других, читающих это, для рекурсивной работы должен находиться в теге НЕПОСРЕДСТВЕННО над интересующими вас тегами. 26.09.2019

  • 2

    Вы можете перебрать soup.contents:

    from bs4 import BeautifulSoup as soup
    r = [i.div.text for i in soup(html, 'html.parser').contents if i != '\n']
    

    Выход:

    ['important text', 'important text']
    
    25.09.2019

    3

    с bs4 4.7.1 вы можете использовать :has и :first-child

    from bs4 import BeautifulSoup as bs
    
    html = '''<div class="my_class">
           <div>important text</div>
           <div class="my_class">
                <div>not important</div>
           </div>
       </div>
       <div class="my_class">
           <div>important text</div>
           <div class="my_class">
                <div>not important</div>
           </div>
       </div>'''
    
    soup = bs(html, 'lxml')
    print([i.text for i in soup.select('.my_class:has(>.my_class) > div:first-child')])
    
    26.09.2019
  • Я бы хотел, чтобы мы могли использовать то же самое и в vba. 26.09.2019
  • Новые материалы

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..