beautifulsoupAan de slag met beautifulsoup


Opmerkingen

In deze sectie bespreken we wat Beautiful Soup is, waarvoor het wordt gebruikt en een korte schets over hoe het te gebruiken.

Beautiful Soup is een Python-bibliotheek die uw vooraf geïnstalleerde html / xml-parser gebruikt en de webpagina / html / xml omzet in een boomstructuur bestaande uit tags, elementen, attributen en waarden. Om precies te zijn, de boom bestaat uit vier soorten objecten, Tag, NavigableString, BeautifulSoup en Comment. Deze boom kan vervolgens worden "opgevraagd" met behulp van de methoden / eigenschappen van het BeautifulSoup-object dat is gemaakt vanuit de parserbibliotheek.

Uw behoefte: Vaak heeft u een van de volgende behoeften:

  1. Misschien wilt u een webpagina parseren om te bepalen hoeveel van welke tags zijn gevonden, hoeveel elementen van elke tag zijn gevonden en wat hun waarden zijn. Misschien wilt u ze veranderen.

  2. Misschien wilt u elementnamen en -waarden bepalen, zodat u ze kunt gebruiken in combinatie met andere bibliotheken voor webpagina-automatisering, zoals Selenium .

  3. Mogelijk wilt u gegevens die in een webpagina worden weergegeven, overbrengen / extraheren naar andere indelingen, zoals een CSV-bestand of naar een relationele database zoals SQLite of mysql. In dit geval helpt de bibliotheek u bij de eerste stap, om de structuur van de webpagina te begrijpen, hoewel u andere bibliotheken zult gebruiken om de overdracht uit te voeren.

  4. Misschien wilt u weten hoeveel elementen met een bepaalde CSS-stijl zijn gestileerd en welke elementen.

Volgorde voor typisch basisgebruik in uw Python-code:

  1. Importeer de Beautiful Soup-bibliotheek

  2. Open een webpagina of html-tekst met de BeautifulSoup-bibliotheek, door te vermelden welke parser moet worden gebruikt. Het resultaat van deze stap is een BeautifulSoup-object. (Opmerking: deze naam van de parser moet al zijn geïnstalleerd als onderdeel van uw Python-pacakges. Bijvoorbeeld, html.parser , is een ingebouwd 'met-batterijen'-pakket dat bij Python wordt geleverd. U kunt andere parsers zoals lxml of html5lib .)

  3. "Query" of zoek het BeautifulSoup-object met de syntaxis 'object.method' en verkrijg het resultaat in een verzameling, zoals een Python-woordenboek. Voor sommige methoden is de uitvoer een eenvoudige waarde.

  4. Gebruik het resultaat van de vorige stap om te doen wat je ermee wilt doen, in de rest van je Python-code. U kunt ook de elementwaarden of kenmerkwaarden in het structuurobject wijzigen. Wijzigingen hebben geen invloed op de bron van de html-code, maar u kunt uitvoeropmaakmethoden (zoals prettify ) gebruiken om nieuwe uitvoer van het BeautifulSoup-object te maken.

Veelgebruikte methoden: meestal worden de methoden .find en .find_all gebruikt om in de structuur te zoeken en de .find_all op te geven.

De invoerargumenten zijn: de gezochte tagnaam, kenmerknamen en andere gerelateerde argumenten. Deze argumenten kunnen worden gepresenteerd als: een tekenreeks, een reguliere expressie, een lijst of zelfs een functie.

Veelgebruikte toepassingen van het BeautifulSoup-object zijn:

  1. Zoeken op CSS-klasse
  2. Zoeken op hyperlinkadres
  3. Zoeken op element-ID, tag
  4. Zoeken op kenmerknaam. Attribuutwaarde.

Als u de boom moet filteren met een combinatie van de bovenstaande criteria, kunt u ook een functie schrijven die evalueert naar waar of onwaar, en zoeken op die functie.

versies

Versie Opmerkingen Verpakkingsnaam Publicatiedatum
3.x Versie 3.2.1; Alleen Python 2 beautifulsoup 2012-02-16
4.x Versie 4.5.0; Python 2 en 3 beautifulsoup4 2016/07/20

Een BeautifulSoup "Hello World" schraapvoorbeeld

from bs4 import BeautifulSoup
import requests

main_url = "https://fr.wikipedia.org/wiki/Hello_world"
req = requests.get(main_url)
soup = BeautifulSoup(req.text, "html.parser")

# Finding the main title tag.
title = soup.find("h1", class_ = "firstHeading")
print title.get_text()

# Finding the mid-titles tags and storing them in a list.
mid_titles = [tag.get_text() for tag in soup.find_all("span", class_ = "mw-headline")]

# Now using css selectors to retrieve the article shortcut links
links_tags = soup.select("li.toclevel-1")
for tag in links_tags:
    print tag.a.get("href")

# Retrieving the side page links by "blocks" and storing them in a dictionary
side_page_blocks = soup.find("div",
                            id = "mw-panel").find_all("div",
                                                      class_ = "portal")
blocks_links = {}
for num, block in enumerate(side_page_blocks):
    blocks_links[num] = [link.get("href") for link in block.find_all("a", href = True)]

print blocks_links[0]
 

Output:

"Hello, World!" program
#Purpose
#History
#Variations
#See_also
#References
#External_links
[u'/wiki/Main_Page', u'/wiki/Portal:Contents', u'/wiki/Portal:Featured_content', u'/wiki/Portal:Current_events', u'/wiki/Special:Random', u'https://donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_en.wikipedia.org&uselang=en', u'//shop.wikimedia.org']
 

Door uw gewenste parser in te voeren bij het opstarten van Beautiful Soup wordt de gebruikelijke Warning vermeden waarin wordt aangegeven dat er no parser was explicitely specified .

Verschillende methoden kunnen worden gebruikt om een element in de webpagina te vinden.

Hoewel er een handvol andere methoden bestaat, zijn CSS classes en CSS selectors twee handige manieren om elementen in de structuur te vinden.

Opgemerkt moet worden dat we naar tags kunnen zoeken door hun kenmerkwaarde in te stellen op True wanneer we ernaar zoeken.

get_text() stelt ons in staat om tekst binnen een tag op te halen. Het retourneert het als een enkele Unicode-string. tag.get("attribute") maakt het mogelijk om de attribuutwaarde van een tag te verkrijgen.

Installatie of instellingen

pip kan worden gebruikt om BeautifulSoup te installeren. Voer de opdracht uit om versie 4 van BeautifulSoup te installeren:

pip install beautifulsoup4
 

Let op: de pakketnaam is beautifulsoup4 plaats van beautifulsoup , de laatste naam staat voor oude release, zie oude beautifulsoup