Avís
Aquest article és antic i és possible que part de la informació estigui desactualitzada o ja no sigui vàlida actualment.
Si tens cap dubte o necessites confirmar algun detall, et recomanem contactar amb el nostre equip de suport per rebre informació actualitzada i assistència personalitzada.
En aquest article s'introduirà l'ús de la biblioteca BeautifulSoup 4 en Python 2, per la qual cosa es pressuposen uns coneixements mínims d'aquest llenguatge. La biblioteca en la versió 4 també permet l'ús de Python 3, però pot donar diversos errors, per la qual cosa és preferible fer servir la versió 2 d'aquest llenguatge. També es pressuposa coneixement de l'estructuració de documents HTML i de les etiquetes més habituals.
Què és BeautifulSoup?
BeautifulSoup és una biblioteca de Python per extreure contingut de fitxers HTML i XML. Resulta molt útil per obtenir informació de pàgines web de manera processable (en un sistema d'arbre fàcil de gestionar).
Instal·lació
Debian i derivats
Si encara no tens Python instal·lat al sistema, es pot instal·lar mitjançant apt:
# apt-get install python2.7 python-pipamb aquesta ordre s'instal·larà l'última versió disponible actualment de Python 2 i PyPi, un gestor de mòduls python molt útil per instal·lar diverses biblioteques d'aquest llenguatge.
Finalment, per instal·lar BeautifulSoup:
# apt-get install python-bs4PyPi
En sistemes diferents de GNU/Linux, el més còmode és instal·lar BeautifulSoup mitjançant aquest gestor. Abans, haurem d'haver instal·lat Python 2, que es pot descarregar des de la pàgina web de python. Assegura't de seleccionar l'opció d'instal·lar _pip_ a l'instal·lador. Després, obre una consola d'ordres i executa
# pip install beautifulsoup4Instal·lació de l'analitzador d'HTML
Per extreure el contingut dels documents HTML o XML, cal instal·lar un analitzador. BeautifulSoup admet l'analitzador integrat en Python, però té alguns inconvenients. En aquest article treballarem amb _lxml_, perquè és el més ràpid, tot i que lògicament també té altres inconvenients. Per veure quin analitzador s'ajusta més a les teves necessitats, consulta la taula de la documentació oficial.
Per instal·lar _lxml_, executa
# apt-get install python-lxmla Debian o
# pip install lxmlNota
L'únic analitzador XML és _lxml-xml_, de manera que, si tens intenció de treballar amb aquest tipus de documents, no hi ha alternativa (encara).
Ús bàsic
Creem un fitxer nou de Python (.py) en el qual el primer pas és importar el mòdul de BeautifulSoup:
from bs4 import BeautifulSoupa més de l'analitzador i de _urllib2_ per llegir pàgines web:
import lxml, urllib2Abans de començar a programar, és bo donar un cop d'ull a l'estructura de la pàgina web en qüestió, per la qual cosa és útil obrir qualsevol navegador web i fer servir “Inspeccionar elemento”, per veure els _id_ de cada element, les seves etiquetes i altra informació que ens sigui útil després per agilitzar la feina.
Al document .py començat anteriorment, hi afegim les dues línies següents:
url = urllib2.urlopen("https://es.wikipedia.org/wiki/Debian_GNU/Linux") # llegir el web amb urllib2
soup = BeautifulSoup(url,"lxml") # crear l'objecte BeautifulSoupL'objecte BeautifulSoup, desat a la variable soup, és el que conté la informació del document HTML complet; en aquest cas farem servir la pàgina de Wikipedia sobre Debian
Accés per les etiquetes
Les etiquetes a BeautifulSoup es corresponen amb les etiquetes dels documents HTML, de manera que per accedir al títol podem escriure:
soup.title # <title>Debian GNU/Linux - Wikipedia, la enciclopedia libre</title>
soup.title.name # title
soup.title.string # Debian GNU/Linux - Wikipedia, la enciclopedia libreOn es pot apreciar la diferència entre els atributs _name_ i _string_. Com es veu a l'exemple, si no s'especifica cap atribut s'obté el text en HTML tal com és.
Si hi ha diverses etiquetes iguals, com ara les _a_, en escriure `soup.a` només s'accedeix a la primera etiqueta d'aquest tipus. Per accedir a una altra que no sigui la primera, es pot crear una llista amb
alst = soup.find_all('a')i a partir d'aquesta es pot accedir als índexs de cada element amb
alist[i]on y és l'índex de l'element _a_ al qual es vol accedir, començant des de 0.
Per accedir al contingut d'un atribut en particular, com ara l'_id_ d'un encapçalament, es fa servir el format següent:
soup.ETIQUETA['ATRIBUTO']un exemple d'aquesta última part, fent servir
find_alli accedint a atributs, és:
alist = soup.find_all('a') # [<a id="top"></a>, ..., <a href="//www.mediawiki.org/"><img alt="Powered by MediaWiki" height="31" src="/static/images/poweredby_mediawiki_88x31.png" srcset="/static/images/poweredby_mediawiki_132x47.png 1.5x, /static/images/poweredby_mediawiki_176x62.png 2x" width="88"/></a>]
print alist[3] # element 4 de la llista (comença des de 0): <a href="/wiki/GNU" title="GNU">GNU</a>
print alist[3]['href'] # atribut href de l'element 4: /wiki/GNU
print alist[3]['title'] # atribut title de l'element 4: GNUAccés a través dels fills
A l'apartat anterior s'ha vist com accedir a través de les etiquetes del document. Ara recorrerem aquest document de manera jeràrquica en forma d'arbre.
Per obtenir els nivells inferiors a una etiqueta, per exemple a l'etiqueta _head_, escrivim el codi següent:
soup.head.contentsque ens retornarà una llista amb les diferents etiquetes, cadascuna un element de la llista. Per accedir a cada element d'aquesta llista, ho fem de la manera habitual en Python, amb claudàtors:
soup.head.contents[i] # accedir a l'element i-1 de la llistaCom que és una estructura d'arbre, es pot accedir a l'element superior a un de donat; per exemple, si som a l'etiqueta _title_, podem “escalar” fins a l'etiqueta _head_:
soup.title.parentque ens mostra tota la informació continguda a _head_. També és possible concatenar _parent_,
soup.title.parent.parentque en aquest cas ens retornaria l'HTML complet.
Documentació
Tota la documentació sobre aquesta biblioteca es troba a https://www.crummy.com/software/BeautifulSoup/bs4/doc/, és molt completa i aporta una gran varietat d'exemples.
CC-BY Creative Commons.