Web Scraping:使用Python中的Beautiful Soup提取不同的重复类及其内容

时间:2018-03-09 12:25:03

标签: python html web-scraping beautifulsoup

我对网络抓取很新。我有一个很长的网站,它遵循以下格式:( 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(或者如果需要另一个库)处理这个问题的最佳方法是什么。非常感谢!

1 个答案:

答案 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>ABC来覆盖所有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