我对网络抓取很新。我有一个很长的网站,它遵循以下格式:( A类是标题,B类字幕,C类文字段落)
<p class="A"> TEXT </p>
<p class="B"> TEXT </p>
<p class="C"> TEXT </p>
<p class="C"> TEXT </p>
<p class="C"> TEXT </p>
所以基本上A类和B类都出现一次,然后是一个或多个C类。每个类都围绕着文本。这种模式发生了500多次,所以我真的想自动提取。
我想创建一个CSV,其第一列包含A类标题文本,第二列包含B类字幕文本,第三列包含C类文本。
我已经想出如何提取特定的类+文本,例如:
soup.find_all('p', class_='A')
但问题是我有几个与一个A和B类相关的C类文本。使用Beautiful Soup(或者如果需要另一个库)处理这个问题的最佳方法是什么。非常感谢!
答案 0 :(得分:1)
我猜你的HTML有点像这样:
<p class="A">Title1</p>
<p class="B">Subtitle1</p>
<p class="C">Text1</p>
<p class="C">Text1</p>
<p class="C">Text1</p>
<p class="A">Title2</p>
<p class="B">Subtitle2</p>
<p class="C">Text2</p>
<p class="C">Text2</p>
<p class="C">Text2</p>
您可以在此处执行的操作是,使用<p>
或A
或B
和C
来覆盖所有find_all('p', class_=['A', 'B', 'C'])
代码。
基本的想法是,如果我们遇到p
标记class="A"
,则表示上一段已完成,我们已将字符串添加到CSV中。
soup = BeautifulSoup(html, 'lxml') # html is the above html
title, subtitle, para = '', '', ''
for p in soup.find_all('p', class_=['A', 'B', 'C']):
if p['class'][0] == 'A':
if title:
print(title, subtitle, para) # Or add these values in CSV
title = p.text
para = ''
continue
if p['class'][0] == 'B':
subtitle = p.text
continue
para += p.text + ' '
print(title, subtitle, para) # Or add these values in CSV
输出:
Title1 Subtitle1 Text1 Text1 Text1
Title2 Subtitle2 Text2 Text2 Text2