繁体   English   中英

如何使用 python Beautiful Soup 从 html 网页中提取文章的内容?

[英]How could I extract the content of an article from a html webpage using python Beautiful Soup?

我是 python 的新手,我正在尝试将 webscraping 作为练习。 我想抓取网页内每篇文章的内容和标题。 我的代码有问题,因为我认为效率不高,我想对其进行优化。

我要抓取的页面是https://www.ansa.it/sito/notizie/politica/politica.shtml

这是我到目前为止所做的:

#libraries
from bs4 import BeautifulSoup
from bs4 import BeautifulSoup as soup
import requests
import pandas as pd
import urllib.request,sys,time
import csv
from csv import writer
import time
from datetime import datetime

r= requests.get('https://www.ansa.it/sito/notizie/politica/politica.shtml')
b= soup(r.content, 'lxml')

title=[]
links=[]
content=[]

for c in b.findAll('h3',{'class':'news-title'}):
   title.append(c.text.strip())  
for c in b.findAll("h3", {"class": "news-title"}):
    links.append(c.a["href"])
for link in links: 
    page=requests.get('https://www.ansa.it'+link)
    bsjop=soup(page.content)
    for n in bsjop.findAll('div',{'itemprop': 'articleBody'}):
        content.append(n.text.strip())

问题是我的输出是由多个链接、多个标题和多个相互不匹配的内容组成的(比如一篇文章有​​标题而内容与之无关)

如果您知道我可以改进代码的方法,那就太好了,谢谢

要将所有文章标题、网址、文本放入 Pandas DataFrame 中,您可以使用下一个示例(我使用tqdm模块来获得漂亮的进度条):

import requests
from tqdm import tqdm
from bs4 import BeautifulSoup


url = "https://www.ansa.it/sito/notizie/politica/politica.shtml"
soup = BeautifulSoup(requests.get(url).content, "html.parser")

all_data = []
for title in tqdm(soup.select("h3.news-title")):
    t = title.get_text(strip=True)
    u = title.a["href"]
    s = BeautifulSoup(
        requests.get("https://www.ansa.it" + u).content, "html.parser"
    )
    text = s.select_one('[itemprop="articleBody"]')
    text = text.get_text(strip=True, separator="\n") if text else ""

    all_data.append([t, u, text])


df = pd.DataFrame(all_data, columns=["Title", "URL", "Text"])
df.to_csv("data.csv", index=False)

创建data.csv (来自 LibreOffice 的屏幕截图):

在此处输入图像描述

import requests
from bs4 import BeautifulSoup
import pandas as pd

news_list = []
r = requests.get('https://www.ansa.it/sito/notizie/politica/politica.shtml')
soup = BeautifulSoup(r.text, 'html.parser')
articles = soup.select('article.news')
for art in articles:
    try:
        title = art.select_one('h3').text.strip()
        if 'javascript:void(0);' in art.select('a')[0].get('href'):
            url = 'https://www.ansa.it' + art.select('a')[1].get('href')
        else:
            url = 'https://www.ansa.it' + art.select('a')[0].get('href')
        r = requests.get(url)
        soup = BeautifulSoup(r.text, 'html.parser')
        content = soup.select_one('div.news-txt').text.strip()
        print(f'retrieving {url}')
        news_list.append((title, content, url))
    except Exception as e:
        print(art.text.strip(), e)

df = pd.DataFrame(news_list, columns = ['Title', 'Content', 'Url'])
print(df)

这将为页面上的某些链接返回一些错误,您必须对其进行调查和调试(如果需要,请寻求帮助 - 这是学习过程的重要部分),以及成功检索列表的数据框,看起来像这个:

    Title   Content Url
0   Letta: 'Ora difficile ricomporre con M5s'. Mel...   Partiti scossi dallo scioglimento anticipato d...   https://www.ansa.it/sito/notizie/politica/2022...
1   L'emozione di Draghi: 'Ancheil cuore dei banch...   "Certe volte anche il cuore dei banchieri cent...   https://www.ansa.it/sito/notizie/politica/2022...
2   La giornata di Draghi in foto       https://www.ansa.it/sito/photogallery/primopia...
3   Il timing del voto, liste entro un mese. A Fer...   Le liste dei candidati entro un mese a partire...   https://www.ansa.it/sito/notizie/politica/2022...
4   Si lavora sulla concorrenza, ipotesi stralcio ...   Il DDL Concorrenza andrà in Aula alla Camera l...   https://www.ansa.it/sito/notizie/economia/2022...
5   Le cifre del governo Draghi: 55 voti fiducia e...   Una media di 7,4 leggi approvate ogni mese su ...   https://www.ansa.it/sito/notizie/politica/2022...
6   I 522 giorni del governo Draghi LE FOTO L'arrivo di SuperMario, gli incontri, le allea...   https://www.ansa.it/sito/photogallery/primopia...
7   Presidi, disappunto per le urne in autunno, ci...   "C'è disappunto non preoccupazione per le urne...   https://www.ansa.it/sito/notizie/politica/2022...
8   Ucraina: Di Maio,sostegno ricerca mercati alte...   (ANSA) - ROMA, 22 LUG - Lo scoppio del conflit...   https://www.ansa.it/sito/photogallery/primopia...
9   Il giorno più lungo: dal Senato fiducia a Drag...   Passa la fiducia al premier Draghi in Senato, ...   https://www.ansa.it/sito/notizie/politica/2022...
10  Oltre mille sindaci a sostegno di Draghi    Nei giorni che attendono il mercoledì che deci...   https://www.ansa.it/sito/notizie/politica/2022...
11  Mattarella scioglie le Camere, si vota il 25 s...   E' stata una scelta "inevitabile", il voto del...   https://www.ansa.it/sito/notizie/politica/2022...
12  Camere sciolte ma il vitalizio è salvo  Nonostante lo scioglimento delle Camere antici...   https://www.ansa.it/sito/notizie/politica/2022...
13  Ultimatum di Conte, risposte o fuori. Di Maio:...   Senza "risposte chiare" il Movimento 5 Stelle ...   https://www.ansa.it/sito/notizie/politica/2022...
14  Di Maio, Conte sta compiendo una vendetta poli...   Se le cose restano come sono oggi "Mario Dragh...   https://www.ansa.it/sito/notizie/politica/2022...
15  Governo: mercoledì la fiducia fiducia prima al...   Le comunicazioni del presidente del Consiglio ...   https://www.ansa.it/sito/notizie/politica/2022...
16  Il giorno più lungo: dal Senato fiducia a Drag...   Passa la fiducia al premier Draghi in Senato, ...   https://www.ansa.it/sito/notizie/politica/2022...
17  Mattarella scioglie le Camere, si vota il 25 s...   E' stata una scelta "inevitabile", il voto del...   https://www.ansa.it/sito/notizie/politica/2022...
18  Il discorso di Draghi al Senato 'Partiti, pron...   "Siamo qui perché lo hanno chiesto gli italian...   https://www.ansa.it/sito/notizie/politica/2022...
19  Governo: mercoledì la fiducia fiducia prima al...   Le comunicazioni del presidente del Consiglio ...   https://www.ansa.it/sito/notizie/politica/2022...
20  Draghi al Senato per una fiducia al buio. Prem...   Draghi al bivio tra governo e crisi. Alle 9.30...   https://www.ansa.it/sito/notizie/politica/2022...
21  Ultimatum di Conte, risposte o fuori. Di Maio:...   Senza "risposte chiare" il Movimento 5 Stelle ...   https://www.ansa.it/sito/notizie/politica/2022...
22  Camere sciolte ma il vitalizio è salvo  Nonostante lo scioglimento delle Camere antici...   https://www.ansa.it/sito/notizie/politica/2022...

如果您指的是同一个元素,则不需要两个不同的循环。 试试下面的代码来保存标题和链接。

for c in b.findAll('h3',{'class':'news-title'}):
   title.append(c.text.strip()) 
   links.append(c.a["href"])

通过组合,您将确保标题和链接是从同一元素中提取的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM