scrapy

Scrapy met XPath-kiezers

Scrapy met XPath-kiezers
HTML is de taal van de webpagina's en er hangt veel informatie tussen het openen en sluiten van elke webpagina web html label. Er zijn veel manieren om hier toegang toe te krijgen, maar in dit artikel zouden we dit doen met de Xpath-selector via de Scrapy-bibliotheek van Python.

De Scrapy-bibliotheek is een zeer krachtige webscraping-bibliotheek, ook gemakkelijk te gebruiken. Als dit nieuw voor u is, kunt u de beschikbare tutorial over het gebruik van de Scrapy-bibliotheek volgen.

Deze tutorial behandelt het gebruik van Xpath-selectors. Xpath gebruikt pad-achtige syntaxis om door de knooppunten van XML-documenten te navigeren. Ze zijn ook handig bij het navigeren door HTML-tags.

In tegenstelling tot de Scrapy-zelfstudie, gaan we al onze bewerkingen hier op de terminal uitvoeren omwille van de eenvoud. Dit betekent echter niet dat Xpath niet kan worden gebruikt met het juiste Scrapy-programma, ze kunnen worden gebruikt in de parse-bibliotheek op de responsparameter.

We gaan aan de slag met het voorbeeld.web schrapen.com-site, omdat het heel eenvoudig is en zou helpen de concepten te begrijpen.

Typ de onderstaande opdracht om scrapy in onze terminal te gebruiken:

$ scrapy shell http://voorbeeld.web schrapen.com

Het zou de site bezoeken en de benodigde informatie krijgen, en ons vervolgens een interactieve shell achterlaten om mee te werken. U zou een prompt moeten zien zoals:

In 1]:

Vanuit de interactieve sessie gaan we aan de slag met de reactie voorwerp.

Dit is hoe onze syntaxis eruit zou zien voor het grootste deel van dit artikel:

In [1]: reactie.xpath('xpathsyntaxis').extract()

Deze opdracht hierboven wordt gebruikt om alle overeenkomende tags te extraheren volgens de Xpath-syntaxis en deze vervolgens op te slaan in een lijst.

In [2]: reactie.xpath('xpathsyntaxis').extract_first()

Deze opdracht hierboven wordt gebruikt om alleen de eerste overeenkomende tag te extraheren en op te slaan in een lijst.
We kunnen nu aan de Xpath-syntaxis gaan werken.

NAVIGATIETAGS

Navigeren door tags in Xpath is heel eenvoudig, het enige dat nodig is, is de schuine streep "/" gevolgd door de naam van de tag.

In [3]: reactie.xpath('/html').extract()

Het bovenstaande commando zou de . retourneren html tag en alles wat het bevat als een enkel item in een lijst.

Als we de hoofdtekst van de webpagina willen krijgen, gebruiken we het volgende:

In [4]: ​​reactie.xpath('/html/body').extract()

Xpath staat ook het jokerteken "*" toe, dat overeenkomt met alles in het niveau waarin het wordt gebruikt.

In [5]: reactie.xpath('/*').extract()

De bovenstaande code zou overeenkomen met alles in het document. Hetzelfde gebeurt als we '/html' gebruiken.

In [6]: reactie.xpath('/html/*').extract()

Naast het navigeren door tags, kunnen we alle onderliggende tags van een bepaalde tag krijgen door de "//" te gebruiken.

In [7]: reactie.xpath('/html//a').extract()

De bovenstaande code retourneert alle ankertags onder in de html-tag i.e. het zou een lijst met alle onderliggende ankertags retourneren.

TAGS OP KENMERKEN EN HUN WAARDEN

Soms kan het lastig zijn om door html-tags te navigeren om bij de vereiste tag te komen. Dit probleem kan worden voorkomen door simpelweg de benodigde tag te vinden aan de hand van zijn attribuut.

In [8]: reactie.xpath('/html//div[@id = "paginering"]').extract()

De bovenstaande code retourneert alle div tags onder de html tag die de . heeft ID kaart attribuut met een waarde van paginering.

In [9]: reactie.xpath('/html//div[@class = "span12"]').extract()

De bovenstaande code retourneert een lijst met alle div tags onder de html-tag, alleen als ze het class-attribuut hebben met een waarde van span12.

Wat als u de waarde van het attribuut niet weet?? En het enige dat u wilt, is tags met een bepaald kenmerk krijgen, zonder u zorgen te maken over de waarde ervan. Dit doen is ook eenvoudig, het enige wat u hoeft te doen is alleen het @-symbool en het attribuut te gebruiken.

In [10]: reactie.xpath('/html//div[@class]').extract()

Deze code retourneert een lijst met alle div-tags die het class-attribuut bevatten, ongeacht welke waarde dat class-attribuut heeft.

Hoe zit het als u slechts een paar tekens kent die in de waarde van een attribuut voorkomen?? Het is ook mogelijk om dat soort tags te krijgen.

In [11]: reactie.xpath('/html//div[bevat(@id, "ion")]').extract()

De bovenstaande code retourneert alle div-tags onder de html-tag die het id-attribuut hebben, maar we weten niet welke waarde het attribuut heeft, behalve dat we weten dat het "ion" bevat.

De pagina die we aan het ontleden zijn, heeft slechts één tag in deze categorie en de waarde is "paginering", dus deze zou worden geretourneerd.

Cool toch?

TAGS OP HUN TEKST

Onthoud dat we eerder tags hebben gekoppeld aan hun kenmerken. We kunnen tags ook matchen met hun tekst.

In [12]: reactie.xpath('/html//a[.=" Algerije"]').extract()

De bovenstaande code zou ons helpen om alle ankertags met de tekst " Algerije " erin te krijgen. NB: het moeten tags zijn met precies die tekstinhoud.

Geweldig.

Hoe zit het als we de exacte tekstinhoud niet weten en we slechts een paar van de tekstinhoud kennen?? Wij kunnen dat ook.

In [13]: reactie.xpath('/html//a[bevat (text(),"A")]').extract()

De bovenstaande code zou de tags krijgen met de letter "A" in hun tekstinhoud.

INHOUD VAN DE TAG EXTRACEREN

Al die tijd hebben we het gehad over het vinden van de juiste tags. Het is tijd om de inhoud van de tag te extraheren wanneer we deze hebben gevonden.

Het is vrij eenvoudig. Het enige wat we hoeven te doen is "/text()" toevoegen aan de syntaxis, en de inhoud van de tag zou worden geëxtraheerd.

In [14]: reactie.xpath('/html//a/text()').extract()

De bovenstaande code zou alle ankertags in het html-document krijgen en vervolgens de tekstinhoud extraheren.

DE LINKS EXTRACEREN

Nu we weten hoe we de tekst in tags moeten extraheren, moeten we ook weten hoe we de waarden van attributen kunnen extraheren. Meestal zijn de waarden van attributen die voor ons van het grootste belang zijn links.

Dit doen is bijna hetzelfde als het extraheren van de tekstwaarden, maar in plaats van "/text()" zouden we het "/@" -symbool en de naam van het attribuut gebruiken.

In [15]:reactie.xpad('/html//a/@href').extract()

De bovenstaande code zou alle links in de ankertags extraheren, de links zouden de waarden moeten zijn van de href attribuut.

NAVIGERENDE TAGS VOOR BROERSN

Als het je is opgevallen, hebben we al die tijd door tags genavigeerd. Er is echter één situatie die we nog niet hebben aangepakt.

Hoe selecteren we een bepaalde tag wanneer tags met dezelfde naam zich op hetzelfde niveau bevinden??




Afghanistan




Aland-eilanden


In een geval zoals het bovenstaande, als we ernaar willen kijken, zouden we kunnen zeggen dat we zouden gebruiken extract_first() om de eerste wedstrijd te krijgen.

Maar wat als we de tweede willen evenaren?? Wat als er meer dan tien opties zijn en we willen de vijfde?? Daar gaan we nu antwoord op geven.

Hier is de oplossing: wanneer we onze Xpath-syntaxis schrijven, plaatsen we de positie van de tag die we willen tussen vierkante haken, net zoals we indexeren, maar de index begint bij 1.

Kijkend naar de html van de webpagina waar we mee te maken hebben, zou je merken dat er veel tags op hetzelfde niveau. Om de derde te krijgen tag, zouden we de volgende code gebruiken:

In [16]: reactie.xpath('/html//tr[3]').extract()

Je zou ook merken dat de tags zijn in tweeën, als we alleen de tweede willen tags van de rijen zouden we het volgende doen:

In [17]: reactie.xpath('/html//td[2]').extract()

CONCLUSIE:

Xpath is een zeer krachtige manier om html-bestanden te ontleden en zou kunnen helpen het gebruik van reguliere expressies bij het ontleden te minimaliseren, aangezien het de bevat functie in zijn syntaxis.

Er zijn andere bibliotheken die parseren met Xpath mogelijk maken, zoals Selenium voor webautomatisering. Xpath geeft ons veel opties bij het ontleden van html, maar wat in dit artikel is behandeld, zou u door veelvoorkomende html-parseerbewerkingen moeten kunnen leiden.

Emuleer muisklikken door te zweven met Clickless Mouse in Windows 10
Het gebruik van een muis of toetsenbord in de verkeerde houding of overmatig gebruik kan leiden tot veel gezondheidsproblemen, waaronder spanning, car...
Voeg muisbewegingen toe aan Windows 10 met deze gratis tools
In de afgelopen jaren zijn computers en besturingssystemen sterk geëvolueerd. Er was een tijd dat gebruikers opdrachten moesten gebruiken om door best...
Beheer en beheer muisbewegingen tussen meerdere monitoren in Windows 10
Muisbeheer voor twee schermen laat je muisbewegingen tussen meerdere monitoren controleren en configureren door de bewegingen nabij de grens te vertra...