如何从新闻文章的语料库中抓取特定类别并以适当的文件格式存储它们以供进一步分类+评估?

How to scrape specific categories from a corpus of news articles and store them in an appropriate file format for further classification + evaluation?

基本上我想做的是从网站HTML解析

对于 3 个特定类别。我想检索 2020 年 1 月至 2020 年 12 月所有这些文章的每个月的标题、短文本片段和类别标签,然后将这些信息存储为适当的文件格式,以对其进行文本分类和模型评估。

我知道你必须使用 retrieve 然后将其提供给 beautifulsoup。只是不知道如何在上面link上查询每个月特定类别下的所有文章,然后将这些数据存储在一起。

即使在这里向正确的方向轻推,我也会非常感激!

下面是我到目前为止完成的代码:

import requests
from bs4 import BeautifulSoup
page = requests.get("html")
page.status_code
articles = page.content

soup_article = BeautifulSoup(articles, "html.parser")

x = soup_article.find_all("a")
x
for month in x:
    month.find_all(class_="article")
    print(month)

鉴于 url 构造的模式,您可以生成许多 url 而无需删除它们。每个月需要从第一页抓取页数,以确定每个月要生成多少 url。如果你不想 calendar 导入,你当然可以抓取它们,或者简单地使用带有 {1:'jan', 2:'feb',.....} 的字典并将其用于 return 在 [=19] 中使用的月份缩写=]生成步骤

我使用 css :contains 来定位所需的类别。我使用一个函数从每个页面中提取一个数据框并将它们组合成一个最终的数据框,然后写入 csv。

import requests 
import calendar
from bs4 import BeautifulSoup as bs
import pandas as pd

def get_data(soup, link):    
    rows = []

    for article in soup.select('.article:has(.metadata:nth-of-type(2):contains("Books","Music","Film"))'):
        title = article.select_one('a').text
        category = article.select_one('.metadata:nth-of-type(2)').text.replace('Category: ','')
        desc = article.select_one('.snippet').text
        rows.append([title, desc, category, link])
    return pd.DataFrame(rows)

if __name__ == '__main__':
    
    with requests.Session() as s:
        r = s.get('http://mlg.ucd.ie/modules/COMP41680/assignment2/index.html')
        soup = bs(r.content, 'lxml')
        links = ['http://mlg.ucd.ie/modules/COMP41680/assignment2/' + i['href'] for i in soup.select('.list-group a')]
        urls = []
        results = []
        
        for number, link in enumerate(links, 1):
            soup = bs(s.get(link).text, 'lxml')
            pages = int(soup.select_one('.results').text.split('of ')[-1])
            #print(pages)
            results.append(get_data(soup, link))
        
            for day in range(2, pages + 1):
                urls.append(f'http://mlg.ucd.ie/modules/COMP41680/assignment2/month-{calendar.month_name[number][:3].lower()}-{str(day).zfill(3)}.html')

        for url in urls:
            df = get_data(soup, url)
            results.append(df) 
        
    final = pd.concat(results)
    final.columns = ['Title', 'Description', 'Category', 'Link']
    print(final.head())
    final.to_csv('data.csv', index = False, encoding = 'utf-8-sig')