Я пытаюсь очистить два набора данных : один с и один без, есть ли способ исключить-выбрать?

#python #web-scraping #beautifulsoup

#python #веб-очистка #beautifulsoup

Вопрос:

 <div id="column2_A415">
    <h2 class="content_header content_header_yellow"><strong>Date</strong></h2>
    <p><strong>Case</strong></p>
    <p>Summary</p>
    <h2 class="content_header content_header_yellow"><strong>Date</strong></h2>
    <p><strong>Case</strong></p>
    <p>Summary</p>
 

в конечном счете, мне нужен фрейм данных с 2 столбцами: ‘case’ и ‘summary’ . (суп — это bs4 ofc)

пока это то, что у меня есть:

 column = soup.find('div', id='column2_A415')
date = column.h2.strong.text
case = column.p.strong.text
summary = ???
 

очевидно, я сделаю цикл после того, как выясню, как извлечь сводную часть исходного кода html. заранее спасибо!

Ответ №1:

С помощью bs4 4.7.1 вы можете указать :has p has strong child , а затем отрицать это с :not помощью, чтобы получить их без strong

 from bs4 import BeautifulSoup as bs

html = '''<div id="column2_A415"> 
   <h2 class="content_header content_header_yellow"><strong>Date</strong></h2> 
   <p><strong>Case</strong></p> 
   <p>Summary</p> 
   <h2 class="content_header content_header_yellow"><strong>Date</strong></h2> 
   <p><strong>Case</strong></p> 
   <p>Summary</p>
  </div>'''

soup = bs(html, 'lxml') # 'html.parser'   
cases = [p.text for p in soup.select('p:has(strong)')]
summaries = [p.text for p in soup.select('p:not(:has(strong))')]
print('cases: ', cases, ' summaries: ', summaries)
 

Прочитайте о псевдоклассах css ( :not, :has ): https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors#pseudo

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

1. невероятно!! и последнее: как бы вы повторили «Дату»? благодарю вас за непредусмотрительность

2. может быть, с h2:has(strong)

Ответ №2:

Предполагая, что в каждой строке всегда есть два абзаца, а в столбце нет других абзацев, вы можете найти все абзацы, а затем взять четные и нечетные из них:

 all_para = [p.text for p in column.findAll('p')]
p1 = all_para[::2]
p2 = all_para[1::2]
 

Теперь у вас есть два списка, которые можно использовать для построения фрейма данных.

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

1. привет, я новичок в этом, не могли бы вы объяснить свое решение? я не думаю, что понимаю. я хочу провести различие при извлечении «Case» и «Summary». спасибо за ваше терпение

2. Поскольку вы изменили свой вопрос, мне пришлось изменить ответ. См. Выше.