Home > OS >  How can I select the specific a-tag and extract its href?
How can I select the specific a-tag and extract its href?

Time:07-17

I am doing a project which requires webscraping news content (the whole article) from websites. the page I am scraping is https://tg24.sky.it/politica, and I got the headlines with the following code:

r= requests.get('https://tg24.sky.it/politica')
b= soup(r.content, 'lxml')

title=[]

for c in b.findAll('h2',{'class':'c-card__title'}):
   title.append(c.text.strip())

Now I want to scrape the href and through it acces the whole content . I am having trouble extracting the href In the webiste the href is in

<a  href="https://tg24.sky.it/politica/2022/07/15/crisi-governo-draghi-ultime-notizie">
        <article >
            <div >
                
                <h2 >Governo Draghi, le ultime notizie sulla crisi aperta da Conte e M5S</h2>

How can I extract the href I tried


for c in b.findAll('a',{'class':'c-card c-card--CA10-m c-card--CA15-t c-card--CA15-d c-card--media  c-card--base '}):
    links.append(c.a['href'])

but it does not work.

CodePudding user response:

I would change two things:

  1. Get the href directly: replace c.a['href'] with c['href']
  2. Specify multiple classes inside a list: soup.findAll("a", {"class": ["c-card", "c-card--CA10-m"]})

In code:

import requests
from bs4 import BeautifulSoup

URL = "https://tg24.sky.it/politica"

response = requests.get(URL)
soup = BeautifulSoup(response.text, "lxml")

links = []
for link in soup.findAll("a", {"class": ["c-card", "c-card--CA10-m"]}):
    links.append(link["href"])

print(links)

NOTE: I haven't added all the classes, just enough to prove my point.

CodePudding user response:

If you insist of getting the urls based off h2 elements, then you can do:

import requests
from bs4 import BeautifulSoup

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.60 Safari/537.17'}

r = requests.get('https://tg24.sky.it/politica', headers=headers)
soup = BeautifulSoup(r.text, 'html.parser')
headlines = soup.select('h2')
for headline in  headlines:
    print(headline.parent.parent.parent.get('href'))

This will result in

https://tg24.sky.it/politica/2022/07/16/crisi-governo-draghi-ultime-notizie
https://tg24.sky.it/politica/2022/07/16/crisi-governo-draghi
https://tg24.sky.it/politica/2022/07/16/ministri-movimento-5-stelle-governo-draghi
https://tg24.sky.it/politica/2022/07/16/crisi-governo-simulazioni-risultati-elezioni
https://tg24.sky.it/politica/2022/07/16/crisi-governo-draghi-perche
https://tg24.sky.it/politica/2022/07/15/crisi-governo-draghi-ultime-notizie
https://tg24.sky.it/politica/2022/07/15/crisi-governo-draghi
https://tg24.sky.it/politica/2022/07/15/crisi-governo-ritiro-ministri-m5s-patuanelli
https://tg24.sky.it/politica/2022/07/15/crisi-governo-italia-mosca
[.....]

CodePudding user response:

It seems that you wanna work with different lists but you should avoid this, in case some information is not available they become different length. So try to scrape all information in one go and store it in more structured way.

To get the links you could select them directly:

soup.find_all('a', {'class': 'c-card'})

or if you come frome your title use .find_previous('a').get('href') on your element:

data = []
for e in soup.find_all('h2', {'class': 'c-card__title'}):
    data.append({
        'title': e.get_text(strip=True),
        'url':e.find_previous('a').get('href')
    })

data would look like:

[{'title': 'Letta: "Draghi continui". Salvini: minacce le lascio a signori del No', 'url': 'https://tg24.sky.it/politica/2022/07/16/crisi-governo-draghi'}, {'title': 'Governo Draghi: chi sono i ministri, vice e sottosegretari del M5S', 'url': 'https://tg24.sky.it/politica/2022/07/16/ministri-movimento-5-stelle-governo-draghi'}, {'title': 'Crisi di governo, cosa ha portato Draghi a volersi dimettere', 'url': 'https://tg24.sky.it/politica/2022/07/16/crisi-governo-draghi-perche'}, {'title': 'Crisi governo: se si andasse al voto ora come finirebbe? LE GRAFICHE', 'url': 'https://tg24.sky.it/politica/2022/07/16/crisi-governo-simulazioni-risultati-elezioni'}, {'title': 'Governo Draghi, le ultime notizie sulla crisi aperta da Conte e M5S', 'url': 'https://tg24.sky.it/politica/2022/07/15/crisi-governo-draghi-ultime-notizie'}, {'title': 'Governo in bilico, Draghi deciso a lasciare e partiti nel caos', 'url': 'https://tg24.sky.it/politica/2022/07/15/crisi-governo-draghi'}, {'title': 'Patuanelli: "Ritiro ministri M5S? Dimissionario è il governo"', 'url': 'https://tg24.sky.it/politica/2022/07/15/crisi-governo-ritiro-ministri-m5s-patuanelli'},...]

Note: In newer code avoid old syntax findAll() instead use find_all() - For more take a minute to check docs

Example

Scrape all information and display as DataFrame:

import requests
from bs4 import BeautifulSoup
import pandas as pd

response = requests.get('https://tg24.sky.it/politica')
soup = BeautifulSoup(response.text)

data = []

for a in soup.find_all('a', {'class': 'c-card'}):

    response = requests.get(a.get('href'))
    asoup = BeautifulSoup(response.text)
    data.append({
        'url': a.get('href'),
        'title': a.h2.get_text(strip=True),
        'content': asoup.article.get_text(strip=True)
    })

pd.DataFrame(data)
Output

Texts of content somewhat shortened for clarity

url title content
0 https://tg24.sky.it/politica/2022/07/16/crisi-governo-draghi Letta: "Draghi continui". Salvini: minacce le lascio a signori del No Crisi Governo, Letta: "Draghi continui". Salvini: "Minacce le lascio ai signori del No"Politica16 lug 2022 - 13:43©AnsaIl segretario dem: "Italia non vuole il voto il 25 settembre". Renzi attacca: "Non ci rassegnamo alla catastrofe voluta da Giuseppe Conte". La Lega critica Letta: "Divide maggioranza, poi chiede unità". Intanto 11 sindaci chiedono al premier di andare avantiascolta articoloCondivi
1 https://tg24.sky.it/politica/2022/07/16/ministri-movimento-5-stelle-governo-draghi Governo Draghi: chi sono i ministri, vice e sottosegretari del M5S Governo Draghi: chi sono i 9 ministri, vice e sottosegretari del Movimento 5 Stelle. FOTOPoliticafotogallery16 lug 2022 - 07:0010 foto©AnsaIn attesa di mercoledì 20 luglio, quando il presidente del Consiglio riferirà in Aula sulla crisi politica delle ultime ore, sono in molti dentro il M5S a chiedere l’uscita dei membri pentastellati dell’esecutivo. Dal capo delegazione Stefano Patuanelli a Carlo
2 https://tg24.sky.it/politica/2022/07/16/crisi-governo-simulazioni-risultati-elezioni Crisi governo: se si andasse al voto ora come finirebbe? LE GRAFICHE Crisi governo: se si andasse al voto ora come finirebbe? LE GRAFICHEPoliticafotogallery16 lug 2022 - 06:3013 fotoYouTrend e Cattaneo Zanetto & CoCosa accadrebbe se si andasse al voto oggi con il Rosatellum? YouTrend e Cattaneo Zanetto & Co hanno condotto una simulazione elettorale con tre scenari: nel primo Pd e M5S sono alleati, nel secondo corrono separati, nel terzo c’è un campo largo composto
3 https://tg24.sky.it/politica/2022/07/16/crisi-governo-draghi-perche Crisi di governo, cosa ha portato Draghi a volersi dimettere Crisi di governo, cosa succede: perché Draghi vuole dimettersiPoliticafotogallery16 lug 2022 - 06:3013 foto©AnsaSecondo il premier "la maggioranza di unità nazionale che ha sostenuto questo governo dalla sua creazione non c'è più". Mentre si attende il suo intervento alle Camere di mercoledì prossimo, circolano voci secondo cui le dimissioni - respinte da Mattarella - sarebbero irrevocabili. Come

...

  • Related