首页 > 解决方案 > 如何从新闻文章语料库中抓取特定类别并将其存储为适当的文件格式以进行进一步分类+评估?

问题描述

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

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

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

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

以下是我到目前为止所做的代码:

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)

标签: pythonhtmlweb-scrapingbeautifulsoupdata-science

解决方案


鉴于 url 构造的模式,您可以生成许多 url 而无需抓取它们。每个月需要从第一页抓取页面数,以确定每个月要生成多少个 url。如果您不想calendar导入,您当然可以刮掉它们,或者简单地使用字典{1:'jan', 2:'feb',.....}并使用它来返回月份缩写以在 url 生成步骤中使用

我使用 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')

推荐阅读