Sådan udtrækker du data fra en HTML-tabel

0
Sådan udtrækker du data fra en HTML-tabel

HTML-tabeller er et meget almindeligt format til visning af information. Når du bygger skrabere, skal du ofte udtrække data fra en HTML-tabel og omdanne dem til et andet struktureret format, for eksempel JSON, CSV eller Excel. I denne artikel vil vi tale om at udtrække data fra en HTML-tabel i Python og Scrapy.

Men før vi starter, er her et par artikler til at opfriske din viden om webskrabning:

  1. Hvad er webskrabning
  2. Hvad er forskellen mellem web-skrabning og webcrawling

Nu hvor vi er klar over det grundlæggende, lad os komme i gang!

HTML tabelelement repræsenterer tabeldata og præsenterer information i todimensionelt format bestående af rækker og kolonner. En tabel starter med

tag efterfulgt af valgfri tags table header

indeholdende header,

indeholder brødteksten af ​​en tabel og indeholder footer. I tabellen har du rækker markeret med

tag og inde i dem er der celler med

eller

tag.

Som vores eksempeltabel vil vi skrabe en eksempelside fra toscrape.com uddannelseswebsted vedligeholdt af Zyte til testformål. – https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html

Tabellen indeholder oplysninger om UPC, pris, afgift og tilgængelighed.

For at udtrække en tabel fra HTML skal du først åbne dine udviklerværktøjer for at se, hvordan HTML’en ser ud og kontrollere, om det virkelig er en tabel og ikke et andet element. Du åbner udviklerværktøjer med F12-tasten, ser fanen “Elementer” og fremhæver det element, du er interesseret i. HTML-kilden til denne tabel ser sådan ud:

Nu hvor du har bekræftet, at dit element faktisk er en tabel, og du kan se, hvordan det ser ud, kan du udtrække disse data til dit forventede format.

For at opnå dette skal du først downloade denne side og derefter analysere HTML. Til download kan du bruge forskellige værktøjer, såsom python-requests eller Scrapy.

Parse tabel ved hjælp af anmodninger og smuk suppe

Smuk suppe er en Python-pakke til at analysere HTML, python-anmodninger er et populært og enkelt HTTP-klientbibliotek.

Først downloader du siden ved hjælp af anmodninger ved at udstede en HTTP GET-anmodning. Responsmetode raise_for_status() kontrollerer svarstatus for at sikre, at det er 200-kode og ikke et fejlsvar. Hvis der er noget galt med svaret, vil det rejse en undtagelse. Hvis alt er i orden, skal du svare på din returtekst.

import requests
from bs4 import BeautifulSoup


def download_page(url):
    response = requests.get(url)
    response.raise_for_status()
    return response.text

Derefter analyserer du tabellen med BeautifulSoup, der udtrækker tekstindhold fra hver celle og gemmer filen i JSON

def main(url):
    content = download_page(url)
    soup = BeautifulSoup(content, 'html.parser')
    result = {}
    for row in soup.table.find_all('tr'):
        row_header = row.th.get_text()
        row_cell = row.td.get_text()
        result[row_header] = row_cell

    with open('book_table.json', 'w') as storage_file:
        storage_file.write(json.dumps(result))

Fuld prøve:

import json

import requests
from bs4 import BeautifulSoup


def download_page(url):
    response = requests.get(url)
    response.raise_for_status()
    return response.text


def main(url):
    content = download_page(url)
    soup = BeautifulSoup(content, 'html.parser')
    result = {}
    for row in soup.table.find_all('tr'):
        row_header = row.th.get_text()
        row_cell = row.td.get_text()
        result[row_header] = row_cell

    with open('book_table.json', 'w') as storage_file:
        storage_file.write(json.dumps(result))


if __name__ == "__main__":
    main("https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html")

Parse HTML-tabel ved hjælp af Scrapy

Du kan skrabe tabeller fra websteder ved hjælp af python-anmodninger, og det kan ofte fungere godt til dine behov, men i nogle tilfælde har du brug for mere kraftfulde værktøjer. Lad os f.eks. sige, at du har 1 tusind bogsider med forskellige tabeller, og du skal analysere dem hurtigt. I dette tilfælde skal du muligvis lave anmodninger samtidigt, og du skal muligvis bruge en asynkron ramme, der ikke blokerer udførelsestråden for hver anmodning.

Du skal muligvis også håndtere mislykkede svar, lad os sige, at siden er midlertidigt nede, og du skal prøve din anmodning igen, hvis svarstatussen er 503. Hvis du gerne vil gøre det med python-anmodninger, skal du tilføje en if-klausul omkring responsdownloaderen, tjek svarstatus og gendownload svar igen, hvis der opstår en fejl. I Scrapy behøver du ikke at skrive nogen kode for dette, fordi det allerede håndteres af downloaderens middleware, det vil automatisk prøve mislykkede svar for dig, uden at der er behov for handling fra din side.

For at udtrække tabeldata med Scrapy skal du download og installer Scrapy. Når du har installeret Scrapy, skal du oprette en simpel edderkop

scrapy genspider books.toscrape.com

Derefter redigerer du spider-kode, og du placerer HTML-parsing-logik inde i parse spider-metoden. Scrapy-respons afslører Selector-objekt giver dig mulighed for at udtrække data fra svarindhold ved at kalde “CSS” eller “XPath” metoder for Selector via svar.

import scrapy


class BooksSpider(scrapy.Spider):
    name="books"
    allowed_domains = ['toscrape.com']
    start_urls = ['https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html']

    def parse(self, response):
        table = response.css('table')
        result = {}
        for tr in table.css('tr'):
            row_header = tr.css('th::text').get()
            row_value = tr.css('td::text').get()
            result[row_header] = row_value

        yield result

Du kører derefter din edderkop ved at bruge runspider-kommandoen ved at sende argumentet -o, der fortæller scrapy at placere udpakkede data i filen output.json.

scrapy runspider books.py -o output.json

Du vil se ret meget log-output, fordi det vil starte alle indbyggede værktøjer i Scrapy, komponenter, der håndterer download-timeouts, referrer-header, omdirigeringer, cookies osv. I outputtet vil du også se dit element udtrukket, det vil se ud som om det her:

2021-11-25 09:16:19 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html> (referer: None)
2021-11-25 09:16:20 [scrapy.core.scraper] DEBUG: Scraped from <200 https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html>
{'UPC': 'a897fe39b1053632', 'Product Type': 'Books', 'Price (excl. tax)': '£51.77', 'Price (incl. tax)': '£51.77', 'Tax': '£0.00', 'Availability': 'In stock (22 available)', 'Number of reviews': '0'}
2021-11-25 09:16:20 [scrapy.core.engine] INFO: Closing spider (finished)

Scrapy vil oprette en fil output.json-fil i den mappe, hvor du kører din spider, og den eksporterer dine udpakkede data til JSON-format og placerer dem i denne fil.

Brug af Python Pandas til at parse HTML-tabeller

Indtil videre har vi udtrukket en simpel HTML-tabel, men tabeller i den virkelige verden er normalt mere komplekse. Du skal muligvis håndtere forskellige layouts, og nogle gange vil der være flere tabeller tilgængelige på siden, og du bliver nødt til at skrive en vælger, der matcher den rigtige. Du vil måske ikke skrive parserkode for hver tabel, du ser. Til dette kan du bruge forskellige python-biblioteker, der hjælper dig med at udtrække indhold fra HTML-tabellen.

En sådan metode er tilgængelig i den populære python pandaer bibliotek, hedder det read_html(). Metoden accepterer adskillige argumenter, der giver dig mulighed for at tilpasse, hvordan tabellen skal parses.

Du kan kalde denne metode med en URL eller fil eller faktisk streng. For eksempel kan du gøre det sådan her:

>>> import pandas
>>> tables_on_page = pandas.read_html("https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html")
>>> table = tables_on_page[0]
>>> table.to_json("table.json", index=False, orient="table")

I outputtet kan du se pandaer genereret ikke kun tabeldata, men også skema. read_html returnerer en liste over Pandas DataFrames, og det giver dig mulighed for nemt at eksportere hver DataFrame til et foretrukket format såsom CSV, XML, Excel-fil eller JSON.

For en simpel use case kan dette være den nemmeste mulighed for dig, og du kan også kombinere det med Scrapy. Du kan importere pandaer i Scrapy tilbagekald og opkald læse HTML med svartekst. Dette giver dig mulighed for at have en kraftfuld generisk edderkop, der håndterer forskellige tabeller og udtrækker dem fra forskellige typer websteder.

Det er det! Så enkelt er det at udtrække en HTML-tabel fra en webside! Men hvis du gerne vil overlade det tunge løft af dataudtræk til eksperter og få enkel adgang til data i dit foretrukne format, er vi her for dig. Bare giv os et råb!

Ähnliche Beiträge

Leave a Reply