MooiSoep

Kinderknooppunten vinden met prachtige soep

Kinderknooppunten vinden met prachtige soep
De taak van webschrapen is er een die inzicht vereist in hoe webpagina's zijn gestructureerd. Om de benodigde informatie van webpagina's te krijgen, moet men de structuur van webpagina's begrijpen, de tags analyseren die de benodigde informatie bevatten en vervolgens de attributen van die tags.

Voor beginners in webscraping met BeautifulSoup, vindt u hier een artikel waarin de concepten van webscraping met deze krachtige bibliotheek worden besproken.

Dit artikel is bedoeld voor programmeurs, data-analisten, wetenschappers of ingenieurs die al de vaardigheden hebben om inhoud van webpagina's te extraheren met BeautifulSoup. Als je geen kennis hebt van deze bibliotheek, raad ik je aan om de BeautifulSoup-zelfstudie voor beginners door te nemen.

Nu kunnen we verder gaan - ik wil geloven dat je deze bibliotheek al hebt geïnstalleerd.  Zo niet, dan kunt u dit doen met de onderstaande opdracht:

pip installeer BeautifulSoup4

Aangezien we werken met het extraheren van gegevens uit HTML, hebben we een eenvoudige HTML-pagina nodig om deze concepten op te oefenen.  Voor dit artikel zouden we dit HTML-fragment gebruiken om te oefenen. Ik ga het volgende HTML-fragment toewijzen aan een variabele met behulp van de drievoudige aanhalingstekens in Python.

sample_content = """

LinuxHint



Om een ​​ongeordende lijst te maken, wordt de ul-tag gebruikt:
 




Om een ​​geordende lijst te maken, wordt de ol-tag gebruikt:
 


    Hier is een geordende lijst
  1. Nummer een

  2. Nummer twee



Linux-hint, 2018



"""

Nu we dat hebben opgelost, gaan we meteen aan de slag met de BeautifulSoup-bibliotheek.

We gaan gebruik maken van een aantal methoden en attributen die we zouden aanroepen op ons BeautifulSoup-object. We zouden echter onze string moeten ontleden met BeautifulSoup en dan moeten toewijzen aan een "our_soup" variabele.

van bs4 importeer BeautifulSoup als bso
our_soup = bso(sample_content, "lxml")

Voortaan zouden we werken met de variabele "our_soup" en al onze attributen of methoden erop aanroepen.

Even kort, als u nog niet weet wat een onderliggende node is, is het in feite een node (tag) die in een andere node bestaat. In ons HTML-fragment zijn de li-tags bijvoorbeeld onderliggende knooppunten van zowel de "ul"- als de "ol" -tags.

Dit zijn de methoden die we zouden bekijken:

vindKind():

De vindKind methode wordt gebruikt om het eerste onderliggende knooppunt van HTML-elementen te vinden. Als we bijvoorbeeld naar onze "ol"- of "ul"-tags kijken, zouden we er twee onderliggende tags in vinden. Wanneer we echter de vindKind methode, retourneert het alleen het eerste knooppunt als het onderliggende knooppunt.

Deze methode kan erg handig zijn als we alleen het eerste onderliggende knooppunt van een HTML-element willen krijgen, omdat het meteen het vereiste resultaat retourneert.

Het geretourneerde object is van het type bs4.element.Label. We kunnen de tekst eruit halen door het tekstattribuut erop aan te roepen.

Hier is een voorbeeld:

eerste_kind = onze_soep.vind("lichaam").vind("ol")
print(eerste_kind.vindKind())

De bovenstaande code zou het volgende retourneren:

  • Nummer een
  • Om de tekst van de tag te krijgen, noemen we de tekst attribuut erop.

    Leuk vinden:

    print(eerste_kind.vindKind().tekst)

    Om het volgende resultaat te krijgen:

    'Nummer een'
    vindKinderen():

    We hebben een kijkje genomen in de vindKind methode en gezien hoe het werkt. De vindKinderen methode werkt op vergelijkbare manieren, maar zoals de naam al aangeeft, vindt het niet slechts één kindknooppunt, maar krijgt het alle onderliggende knooppunten in een tag.

    Wanneer u alle onderliggende knooppunten in een tag moet krijgen, is de vindKinderen methode is de manier om te gaan. Deze methode retourneert alle onderliggende knooppunten in een lijst, u hebt toegang tot de tag van uw keuze met behulp van het indexnummer.

    Hier is een voorbeeld:

    eerste_kind = onze_soep.vind("lichaam").vind("ol")
    print(eerste_kind.vindKinderen())

    Dit zou de onderliggende knooppunten in een lijst retourneren:

    [
  • Nummer een
  • ,
  • Nummer twee
  • ]

    Om het tweede onderliggende knooppunt in de lijst te krijgen, zou de volgende code het werk doen:

    print(eerste_kind.vindKinderen()[1])

    Om het volgende resultaat te krijgen:

  • Nummer twee
  • Dat is alles wat BeautifulSoup biedt als het gaat om methoden. Daar houdt het echter niet op. Attributen kunnen ook worden aangeroepen op onze BeautifulSoup-objecten om de child/children/descendant node uit een HTML-element te halen.

    inhoud:

    Terwijl de vindKinderen methode deed het eenvoudige werk van het extraheren van de onderliggende knooppunten, de inhoud attributen doet iets anders.

    De inhoud attribuut retourneert een lijst van alle inhoud in een HTML-element, inclusief de onderliggende knooppunten. Dus als je de belt inhoud attribuut op een BeautifulSoup-object, zou het de tekst retourneren als strings en de knooppunten in de tags als a bs4.element.Label voorwerp.

    Hier is een voorbeeld:

    eerste_kind = onze_soep.vind("lichaam").vind("ol")
    print(eerste_kind.inhoud)

    Dit geeft het volgende terug:

    ["\n   Hier is een geordende lijst\n   ",
  • Nummer een
  • ,
    '\n',
  • Nummer twee
  • , '\n']

    Zoals u kunt zien, bevat de lijst de tekst die vóór een onderliggende knoop komt, de onderliggende knoop en de tekst die na de onderliggende knoop komt.

    Om toegang te krijgen tot het tweede onderliggende knooppunt, hoeven we alleen maar gebruik te maken van het indexnummer, zoals hieronder weergegeven:

    print(eerste_kind.inhoud[3])

    Dit zou het volgende retourneren:

  • Nummer twee
  • kinderen:

    Hier is een attribuut dat bijna hetzelfde doet als het content-attribuut:. Het heeft echter een klein verschil dat een enorme impact kan hebben (voor degenen die code-optimalisatie serieus nemen).

    Het child-attribuut retourneert ook de tekst die voor een child-node komt, de child-node zelf en de tekst die na de child-node komt. Het verschil hier is dat het ze retourneert als een generator in plaats van een lijst.

    Laten we eens kijken naar het volgende voorbeeld:

    eerste_kind = onze_soep.vind("lichaam").vind("ol")
    print(eerste_kind.kinderen)

    De bovenstaande code geeft de volgende resultaten (het adres op uw machine hoeft niet overeen te komen met het onderstaande):

    Zoals je kunt zien, retourneert het alleen het adres van de generator. We zouden deze generator kunnen omzetten in een lijst.

    Dit zien we in onderstaand voorbeeld:

    eerste_kind = onze_soep.vind("lichaam").vind("ol")
    print(lijst(eerste_kind).kinderen))

    Dit geeft het volgende resultaat:

    ["\n        Hier is een geordende lijst\n        ",
  • Nummer een
  • ,
    '\n',
  • Nummer twee
  • , '\n']

    afstammelingen:

    Terwijl de kinderen attribuut werkt om alleen de inhoud binnen een tag te krijgen i.e. de tekst, en knooppunten op het eerste niveau, de afstammelingen attribuut gaat dieper en doet meer.

    De afstammelingen attribuut haalt alle tekst en knooppunten op die bestaan ​​in onderliggende knooppunten. Het retourneert dus niet alleen knooppunten voor kinderen, het retourneert ook knooppunten voor kleinkinderen.

    Naast het retourneren van de tekst en tags, retourneert het ook de inhoud in de tags als strings.

    net als de kinderen attribuut, afstammelingen retourneert de resultaten als een generator.

    Dit kunnen we hieronder zien:

    eerste_kind = onze_soep.vind("lichaam").vind("ol")
    print(eerste_kind.afstammelingen)

    Dit geeft het volgende resultaat:

    Zoals eerder gezien, kunnen we dit generatorobject vervolgens converteren naar een lijst:

    eerste_kind = onze_soep.vind("lichaam").vind("ol")
    print(lijst(eerste_kind).nakomelingen))

    We zouden de onderstaande lijst krijgen:

    ["\n   Hier is een geordende lijst\n   ",
  • Nummer een
  • ,
    'Nummer één', '\n',
  • Nummer twee
  • , 'Nummer Twee', '\n']

    Conclusie

    Daar heb je het, vijf verschillende manieren om toegang te krijgen tot onderliggende knooppunten in HTML-elementen. Er kunnen meer manieren zijn, maar met de methoden en attributen die in dit artikel worden besproken, zou men toegang moeten hebben tot de onderliggende node van elk HTML-element.

    Handige hulpmiddelen voor Linux-gamers
    Als je graag games op Linux speelt, is de kans groot dat je apps en hulpprogramma's zoals Wine, Lutris en OBS Studio hebt gebruikt om de game-ervaring...
    HD Remastered Games voor Linux die nog nooit eerder een Linux-release hebben gehad
    Veel game-ontwikkelaars en uitgevers komen met HD-remaster van oude games om de levensduur van franchise te verlengen, fans die compatibiliteit met mo...
    Hoe AutoKey te gebruiken om Linux-spellen te automatiseren
    AutoKey is een hulpprogramma voor desktopautomatisering voor Linux en X11, geprogrammeerd in Python 3, GTK en Qt. Met behulp van de scripting- en MACR...