#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. Поскольку вы изменили свой вопрос, мне пришлось изменить ответ. См. Выше.