3 votes

Impossible d'obtenir certains éléments dispersés d'une page web

J'essaie de récupérer quatre champs d'une page web en utilisant python mais le problème est que les données que je cherche ne sont pas dans un html structuré, donc je ne trouve pas de moyen de les récupérer individuellement.

adresse de la page web

J'ai essayé avec :

import re
import requests
from bs4 import BeautifulSoup

link = 'https://colegios.es/2012/cra-la-gaznata-san-bartolome-de-pinares/'

def get_content(link):
    res = requests.get(link,headers={'User-Agent':'Mozilla/5.0'})
    soup = BeautifulSoup(res.text,"lxml")
    school_name = soup.select_one("h1 > a").get_text(strip=True)
    school_address = soup.find("p",text=re.compile('Dirección:\s*([^"]*?)')).text
    school_phone = soup.find("p",text=re.compile('Tel\.\s*(.*?)\s*')).text
    print(school_name,school_address,school_phone)

if __name__ == '__main__':
    get_content(link)

Ce que j'obtiens est un véritable gâchis :

CRA La Gaznata  San Bartolomé de Pinares CRA La Gaznata Servicios:   Jornada contínua,  Educación Infantil y Primaria   Público Dirección:    del Pino, 2  5267  San Bartolomé de Pinares Ávila  Tel. 920 270 070   Fax 920 270 070 05005981@educa.jcyl.es [google-map-v3 addmarkerlist=”del Pino, 2  5267  San Bartolomé de Pinares Ávila {}5-default.png”] CRA La Gaznata Servicios:   Jornada contínua,  Educación Infantil y Primaria   Público Dirección:    del Pino, 2  5267  San Bartolomé de Pinares Ávila  Tel. 920 270 070   Fax 920 270 070 05005981@educa.jcyl.es [google-map-v3 addmarkerlist=”del Pino, 2  5267  San Bartolomé de Pinares Ávila {}5-default.png”]

Sortie que je souhaite saisir (la deuxième est la banlieue disponible dans le nom) :

CRA La Gaznata 
San Bartolomé de Pinares
del Pino, 2 5267 San Bartolomé de Pinares Ávila 
920 270 070

Comment puis-je obtenir les quatre champs de cette page web ?

2voto

Andrej Kesely Points 20452

La clé est de changer l'analyseur en html5lib De cette façon, le <br> seront correctement traduites en nouvelles lignes par get_text() et il est alors plus facile d'analyser le texte avec la méthode re :

import re
import requests
from bs4 import BeautifulSoup

link = 'https://colegios.es/2012/cra-la-gaznata-san-bartolome-de-pinares/'

def get_content(link):
    res = requests.get(link,headers={'User-Agent':'Mozilla/5.0'})
    soup = BeautifulSoup(res.text,"html5lib")

    text = soup.select_one('.post-content > p').get_text(strip=True, separator='\n')

    school_name, suburb = soup.select_one("h1 > a").get_text(strip=True, separator='\n').split('\n')
    school_address = re.findall(r'Dirección:\s*(.*)', text)[0]
    school_phone = re.findall(r'Tel\.\s*([\d\s]+\d)', text)[0]
    email = re.findall(r'[^\s]+@[^\s]+', text)[0]

    print(school_name)
    print(suburb)
    print(school_address)
    print(school_phone)
    print(email)

if __name__ == '__main__':
    get_content(link)

Impressions :

CRA La Gaznata
San Bartolomé de Pinares
del Pino, 2  5267  San Bartolomé de Pinares Ávila
920 270 070
05005981@educa.jcyl.es

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X