{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction to Python \n", "\n", "### Introduction to Scraping" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "#import pylab\n", "import re\n", "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "import requests\n", "import urllib\n", "from bs4 import BeautifulSoup as bs\n", "\n", "from IPython.display import HTML\n", "\n", "%matplotlib inline\n", "#%matplotlib notebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1 - Using only Pandas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.1 - Scraping HTML tables with Pandas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Checking the page: [List of cities and towns in Austria](https://en.wikipedia.org/wiki/List_of_cities_and_towns_in_Austria)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "18" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "url1 = \"https://en.wikipedia.org/wiki/List_of_cities_and_towns_in_Austria\"\n", "list_df_tables = pd.read_html(url1)\n", "len(list_df_tables)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
NameStatePopulation (as of 2022)[1]
0ViennaVienna1931593
1GrazStyria292630
2LinzUpper Austria207247
3SalzburgSalzburg155331
4InnsbruckTyrol130585
\n", "
" ], "text/plain": [ " Name State Population (as of 2022)[1]\n", "0 Vienna Vienna 1931593\n", "1 Graz Styria 292630\n", "2 Linz Upper Austria 207247\n", "3 Salzburg Salzburg 155331\n", "4 Innsbruck Tyrol 130585" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list_df_tables[0].head()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
NameDesignationPopulation
0AndauMarket town2285
1AntauOther municipality758
2ApetlonMarket town1760
3Bad SauerbrunnOther municipality2219
4Bad TatzmannsdorfOther municipality1554
5BadersdorfOther municipality287
6BaumgartenOther municipality894
7BernsteinMarket town2123
8BildeinOther municipality343
9BocksdorfOther municipality813
\n", "
" ], "text/plain": [ " Name Designation Population\n", "0 Andau Market town 2285\n", "1 Antau Other municipality 758\n", "2 Apetlon Market town 1760\n", "3 Bad Sauerbrunn Other municipality 2219\n", "4 Bad Tatzmannsdorf Other municipality 1554\n", "5 Badersdorf Other municipality 287\n", "6 Baumgarten Other municipality 894\n", "7 Bernstein Market town 2123\n", "8 Bildein Other municipality 343\n", "9 Bocksdorf Other municipality 813" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list_df_tables[1].head(10)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
NameDesignationPopulation
0Afritz am SeeOther municipality1429
1AlbeckOther municipality995
2AlthofenOther city4759
3ArnoldsteinMarket town7096
4ArriachOther municipality1349
\n", "
" ], "text/plain": [ " Name Designation Population\n", "0 Afritz am See Other municipality 1429\n", "1 Albeck Other municipality 995\n", "2 Althofen Other city 4759\n", "3 Arnoldstein Market town 7096\n", "4 Arriach Other municipality 1349" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list_df_tables[2].head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.2 - Read files from URLs with Pandas\n", "\n", "Source: [data.gv.at](https://www.data.gv.at/katalog/dataset/41f8db46-d2d9-48b3-a8b3-138742613c1a)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DatumKategorieTitelBeschreibung
001.Jän.23InternationalNeujahr (staatlicher Feiertag)Beginn des Jahres nach dem gregorianischen Kal...
106.Jän.23ChristentumHeilige Drei Könige (katholisch, evangelisch, ...Beim Dreikönigsfest (auch Epiphanie, das heißt...
206.Jän.23ChristentumOrthodoxer Heiliger Abend (nach julianischem K...Als Symbol für den Stall, den Ort der Geburt J...
307.Jän.23ChristentumOrthodoxes Weihnachten/Orthodoxer Christtag (n...Serbische Bräuche: Am frühen Morgen besucht ei...
422.Jän.23TraditionellChinesisches NeujahrNach dem chinesischen Kalender beginnt das Jah...
502.Feb.23ChristentumMariä Lichtmess / Darstellung des Herrn (katho...Auch \"Einführung Jesu in den Tempel\" genannt. ...
606.Feb.23JudentumTu BiSchwatIn Hebräisch so viel wie: \"15. Tag im Monat Sc...
714.Feb.23InternationalValentinstagAn diesem Tag werden Blumen als Zeichen der Zu...
816.Feb.23IslamHizir Fest14. bis 16. Februar: Hizir Fasten / Festtag (a...
922.Feb.23ChristentumAschermittwoch (katholisch, evangelisch)Für die katholischen Christinnen und Christen ...
\n", "
" ], "text/plain": [ " Datum Kategorie \\\n", "0 01.Jän.23 International \n", "1 06.Jän.23 Christentum \n", "2 06.Jän.23 Christentum \n", "3 07.Jän.23 Christentum \n", "4 22.Jän.23 Traditionell \n", "5 02.Feb.23 Christentum \n", "6 06.Feb.23 Judentum \n", "7 14.Feb.23 International \n", "8 16.Feb.23 Islam \n", "9 22.Feb.23 Christentum \n", "\n", " Titel \\\n", "0 Neujahr (staatlicher Feiertag) \n", "1 Heilige Drei Könige (katholisch, evangelisch, ... \n", "2 Orthodoxer Heiliger Abend (nach julianischem K... \n", "3 Orthodoxes Weihnachten/Orthodoxer Christtag (n... \n", "4 Chinesisches Neujahr \n", "5 Mariä Lichtmess / Darstellung des Herrn (katho... \n", "6 Tu BiSchwat \n", "7 Valentinstag \n", "8 Hizir Fest \n", "9 Aschermittwoch (katholisch, evangelisch) \n", "\n", " Beschreibung \n", "0 Beginn des Jahres nach dem gregorianischen Kal... \n", "1 Beim Dreikönigsfest (auch Epiphanie, das heißt... \n", "2 Als Symbol für den Stall, den Ort der Geburt J... \n", "3 Serbische Bräuche: Am frühen Morgen besucht ei... \n", "4 Nach dem chinesischen Kalender beginnt das Jah... \n", "5 Auch \"Einführung Jesu in den Tempel\" genannt. ... \n", "6 In Hebräisch so viel wie: \"15. Tag im Monat Sc... \n", "7 An diesem Tag werden Blumen als Zeichen der Zu... \n", "8 14. bis 16. Februar: Hizir Fasten / Festtag (a... \n", "9 Für die katholischen Christinnen und Christen ... " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_csv(\"https://www.wien.gv.at/menschen/integration/ogd/interkultureller-kalender-2023.csv\", \n", " skiprows=5, \n", " usecols=[0,1,2,3],\n", " engine=\"python\",\n", " on_bad_lines=\"skip\",\n", " sep=\";\",\n", " )\n", "df.head(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "***\n", "\n", "## 2 - Scraping static pages using only [Requests](https://docs.python-requests.org/en/master/)" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "#### Which one to use: [urllib or requests?](https://stackoverflow.com/questions/2018026/what-are-the-differences-between-the-urllib-urllib2-urllib3-and-requests-modul)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.1 - Getting html content of the page \n", "\n", "Source: [https://www.data.gv.at/](https://www.data.gv.at/suche/?typeFilter%5B%5D=dataset)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "200\n" ] } ], "source": [ "url2 = 'https://www.data.gv.at/suche/?typeFilter%5B%5D=dataset' \n", "content = requests.get(url2)\n", "print(content.status_code)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Check [HTTP status codes](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status) " ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'\\n\\n\\n\\n\\t\\n\\n\\nSuche | data.gv.at\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\t\\n\\t\\n\\t\\n\\t\\n\\t\\n\\n\\t\\n\\t\\n\\t\\n\\t\\n\\t\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "

\n", " Seitenbereiche\n", "

\n", " \n", "
\n", "
\n", " \n", "
\n", " \n", " \"Logo\n", " \n", "
\n", "
\n", "
\n", "
\n", " 41146\n", "
\n", "
\n", " 701\n", "
\n", "
\n", " 2390\n", "
\n", "
\n", "
\n", "
\n", " \n", " Datensätze\n", " \n", "
\n", "
\n", " \n", " Anwendungen\n", " \n", "
\n", "
\n", " \n", " Organisationen\n", " \n", "
\n", "
\n", "
\n", "
\n", " \n", "
\n", "
\n", " \n", "
\n", " \n", "
\n", "
\n", " \n", " \"Mastodon\n", " \n", " */ moment.updateLocale( 'de_DE', {\"months\":[\"Januar\",\"Februar\",\"M\\u00e4rz\",\"April\",\"Mai\",\"Juni\",\"Juli\",\"August\",\"September\",\"Oktober\",\"November\",\"Dezember\"],\"monthsShort\":[\"Jan\",\"Feb\",\"Mrz\",\"Apr\",\"Mai\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Okt\",\"Nov\",\"Dez\"],\"weekdays\":[\"Sonntag\",\"Montag\",\"Dienstag\",\"Mittwoch\",\"Donnerstag\",\"Freitag\",\"Samstag\"],\"weekdaysShort\":[\"So\",\"Mo\",\"Di\",\"Mi\",\"Do\",\"Fr\",\"Sa\"],\"week\":{\"dow\":1},\"longDateFormat\":{\"LT\":\"H:i\",\"LTS\":null,\"L\":null,\"LL\":\"j. F Y\",\"LLL\":\"j. F Y G:i\",\"LLLL\":null}} ); Seitenbereiche Inhalt (Accesskey 0)\n", "Hauptmenü (Accesskey 1)\n", "Suche (Accesskey 2) \t\t\t\t\t\t\t41146\t\t\t\t\t\t \t\t\t\t\t\t\t701\t\t\t\t\t\t \t\t\t\t\t\t\t2390\t\t\t\t\t\t Datensätze Anwendungen Organisationen de en deen \t\t\t\t\tdocument.getElementById(\"ckan_de\").onclick = function () {\n", "\t\t\t\t\t\tlocation.pathname = location.pathname.replace(/^\\/katalog\\/en\\//, '/katalog/');\n", "\t\t\t\t\t}; \t\t\t\t\tdocument.getElementById(\"ckan_en\").onclick = function () {\n", "\t\t\t\t\t\tlocation.pathname = location.pathname.replace(/^\\/katalog(\\/|\\/de\\/)/, '/katalog/en/');\n", "\t\t\t\t\t};\n", "\t\t\t\t Grußbotschaft des Bundespräsidenten zum 10-jährigen data.gv.at Jubiläum Hauptmenü Daten Datensatz finden\n", "Gesamtbestand aller Datensätze COVID-19 Informationsportal\n", "Ausschreibungen laut BVergG2018\n", "Geodaten – INSPIRE Datensätze mit Anwendungen\n", "Veröffentlichende Stellen\n", "Visualisierung der Daten Anleitung zur Datenveröffentlichung\n", "Daten/Dokumente hinzufügen Anwendungen Anwendung finden\n", "Anwendung einreichen Infos Zielsetzung data.gv.at\n", "Open Data Prinzipien\n", "Entwicklung von Open Data\n", "E-Learning-Module zu Open Data\n", "Open Data Videos Cooperation OGD Österreich\n", "Kooperation OGD D-A-CH-LI Informationen zum BVergG 2018\n", "Leitfaden Open Data Analyse\n", "Leitfaden Open Data Governance\n", "Netiquette\n", "Erklärung zur Barrierefreiheit\n", "Datenschutzerklärung\n", "Impressum News News\n", "Newsletter abonnieren Inhalt \tlet params = (new URL(window.location.href)).searchParams;\n", "\tlet typeFilterInput = document.getElementById('typeFilter');\n", "\twindow.addEventListener('load', function() {\n", "\t\ttypeFilterInput.value = params.has('typeFilter[]') ? params.get('typeFilter[]') : (params.has('typeFilter[0]') ? params.get('typeFilter[0]') : '')\n", "\t});\n", "\t Suche erweiterte Suche 42192 Treffer Vorauswahl \n", "OpenDocument (4307)\n", "\t\t\t\t\t\t\t HighValueDataset (3)\n", "\t\t\t\t\t\t\t Kategorien \n", "Bevölkerung (1)\n", "\t\t\t\t\t\t\t Gesellschaft und Soziales (1)\n", "\t\t\t\t\t\t\t Landwirtschaft, Fischerei, Forstwirtschaft & Lebensmittel (140)\n", "\t\t\t\t\t\t\t Wirtschaft & Finanzen (33975)\n", "\t\t\t\t\t\t\t Bildung, Kultur & Sport (448)\n", "\t\t\t\t\t\t\t Energie (0)\n", "\t\t\t\t\t\t\t Umwelt (4311)\n", "\t\t\t\t\t\t\t Regierung & Öffentliche Verwaltung (948)\n", "\t\t\t\t\t\t\t Gesundheit (149)\n", "\t\t\t\t\t\t\t Internationale Themen (0)\n", "\t\t\t\t\t\t\t Justiz, Gesetze & Öffentliche Sicherheit (0)\n", "\t\t\t\t\t\t\t Regionen & Städte (832)\n", "\t\t\t\t\t\t\t Bevölkerung & Gesellschaft (871)\n", "\t\t\t\t\t\t\t Wissenschaft & Technologie (0)\n", "\t\t\t\t\t\t\t Transport & Verkehr (403)\n", "\t\t\t\t\t\t\t Kunst und Kultur (1)\n", "\t\t\t\t\t\t\t Umwelt (109)\n", "\t\t\t\t\t\t\t Veröffentlichende Stelle \n", "Offenerhaushalt.at (32669)\n", "\t\t\t\t\t\t\t Nationalparks Austria (3325)\n", "\t\t\t\t\t\t\t Stadt Linz (767)\n", "\t\t\t\t\t\t\t Umweltbundesamt GmbH (741)\n", "\t\t\t\t\t\t\t Stadt Wien (590)\n", "\t\t\t\t\t\t\t Gemeinde Engerwitzdorf (514)\n", "\t\t\t\t\t\t\t Statistik Austria (370)\n", "\t\t\t\t\t\t\t Land Oberösterreich (223)\n", "\t\t\t\t\t\t\t Stadt Graz (198)\n", "\t\t\t\t\t\t\t Land Salzburg (195)\n", "\t\t\t\t\t\t\t Alle anzeigen ...Veröffentlichende Stelle×AAGES (1)\n", "\t\t\t\t\t\t\tAGES GmbH (1)\n", "\t\t\t\t\t\t\tAMA (33)\n", "\t\t\t\t\t\t\tAMS Österreich (4)\n", "\t\t\t\t\t\t\tANKÖ Service Ges.m.b.H (1)\n", "\t\t\t\t\t\t\tASFINAG (1)\n", "\t\t\t\t\t\t\tAUSSCHREIBUNG.AT (1)\n", "\t\t\t\t\t\t\tAustriaTech (1)\n", "\t\t\t\t\t\t\tAustria Wirtschaftsservice Gesellschaft mbH (1)\n", "\t\t\t\t\t\t\tBBauamt Ref. IV (1)\n", "\t\t\t\t\t\t\tBetriebsleitung Fusch (1)\n", "\t\t\t\t\t\t\tBEV (44)\n", "\t\t\t\t\t\t\tBildungsdirektion Oberösterreich (1)\n", "\t\t\t\t\t\t\tBKA (25)\n", "\t\t\t\t\t\t\tBMA (10)\n", "\t\t\t\t\t\t\tBMBF (1)\n", "\t\t\t\t\t\t\tBMBWF (7)\n", "\t\t\t\t\t\t\tBMEIA (2)\n", "\t\t\t\t\t\t\tBMF (5)\n", "\t\t\t\t\t\t\tBMI (6)\n", "\t\t\t\t\t\t\tBMLRT (1)\n", "\t\t\t\t\t\t\tBMNT (9)\n", "\t\t\t\t\t\t\tBMSGPK (23)\n", "\t\t\t\t\t\t\tBMVIT (5)\n", "\t\t\t\t\t\t\tBundesbeschaffung Ges.m.b.H (1)\n", "\t\t\t\t\t\t\tBundesdenkmalamt (27)\n", "\t\t\t\t\t\t\tCCAMPUS 02-Fachhochschule der Wirtschaft GmbH (1)\n", "\t\t\t\t\t\t\tCooperation OGD Österreich (11)\n", "\t\t\t\t\t\t\tDDachverband der Sozialversicherungsträger (3)\n", "\t\t\t\t\t\t\tEE-Control (1)\n", "\t\t\t\t\t\t\tEinkaufsmanagement WU Wien (3)\n", "\t\t\t\t\t\t\tEnergie Burgenland AG (1)\n", "\t\t\t\t\t\t\teVergabe.at (1)\n", "\t\t\t\t\t\t\tEVN AG, Beschaffung und Einkauf (1)\n", "\t\t\t\t\t\t\tGGemeinde Altmünster (1)\n", "\t\t\t\t\t\t\tGemeinde Diex (1)\n", "\t\t\t\t\t\t\tGemeinde Edt bei Lambach (1)\n", "\t\t\t\t\t\t\tGemeinde Engerwitzdorf (514)\n", "\t\t\t\t\t\t\tGemeinde Eugendorf (2)\n", "\t\t\t\t\t\t\tGemeinde Gutenberg-Stenzengreith (1)\n", "\t\t\t\t\t\t\tGemeinde Gössendorf (2)\n", "\t\t\t\t\t\t\tGemeinde Hippach, Johann-Sponring-Straße 80, 6283 Hippach (1)\n", "\t\t\t\t\t\t\tGemeinde Kirchham (7)\n", "\t\t\t\t\t\t\tGemeinde Klaffer am Hochficht (1)\n", "\t\t\t\n" ] } ], "source": [ "#print(soup.get_text()[0:10000])\n", "print(re.sub(r\"\\n{2,}\",\" \", soup.get_text()[0:5000]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.1.3 - Getting page information" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Suche | data.gv.at\n", "title\n", "Suche | data.gv.at\n", "head\n", "

Seitenbereiche

\n" ] } ], "source": [ "# title of the page\n", "print(soup.title)\n", "\n", "# get attributes:\n", "print(soup.title.name)\n", "\n", "# get values:\n", "print(soup.title.string)\n", "\n", "# beginning navigation:\n", "print(soup.title.parent.name)\n", "\n", "# getting specific values:\n", "print(soup.p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.1.3.1 - Finding paragraph tags `p` is a fairly common task. \n", "In the case above, we're just finding the first one. What if we wanted to find them all?" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[

Seitenbereiche

,

\"\"

]\n" ] } ], "source": [ "print(soup.find_all('p'))" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Seitenbereiche\n", "None\n" ] } ], "source": [ "for paragraph in soup.find_all('p'):\n", " print(paragraph.string)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Seitenbereiche\n", "\n" ] } ], "source": [ "for paragraph in soup.find_all('p'):\n", " print(str(paragraph.text))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The difference between string and text is that string produces a NavigableString object, and text is just typical unicode text. Notice that, if there are child tags in the paragraph item that we're attempting to use .string on, we will get None returned." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.1.3.2 - Extracting anchors and links" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[
Inhalt (Accesskey 0),\n", " Hauptmenü (Accesskey 1),\n", " Suche (Accesskey 2),\n", " \"Logo,\n", " \n", " de,\n", " \n", " en,\n", " de,\n", " en,\n", " \n", " \"Mastodon\n", " ,\n", " \n", " \"Twitter\n", " ,\n", " \n", " \"Facebook\n", " ,\n", " \n", " \"Instagram\n", " ,\n", " \n", " \"RSS\n", " ,\n", " Grußbotschaft des Bundespräsidenten zum 10-jährigen data.gv.at Jubiläum,\n", " Hauptmenü,\n", " ,\n", " ,\n", " Datensatz finden,\n", " Gesamtbestand aller Datensätze,\n", "
]" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soup.find_all('a')[0:20]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.1.3.3 - Extracting only the *href* of anchors and links" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "#jump_inhalt\n", "#jump_menu\n", "#jump_suche\n", "/\n", "https://www.data.gv.at/suche/?typeFilter%5B0%5D=dataset\n", "https://www.data.gv.at/en/search/?typeFilter%5B0%5D=dataset\n", "#\n", "#\n", "https://mastodon.social/@datagvat\n", "https://twitter.com/datagvat\n", "https://www.facebook.com/groups/opendataaustria\n", "https://www.instagram.com/data.gv.at/\n", "/infos/rss-feeds/\n", "/2022/09/29/10-jahre-data-gv-at-van-der-bellen/\n", "None\n", "#\n", "https://www.data.gv.at/daten/\n", "https://www.data.gv.at/daten/\n", "/katalog/dataset/metadaten-von-ogd-osterreich\n", "#\n", "https://www.data.gv.at/daten/covid-19/\n", "https://www.data.gv.at/daten/ausschreibungen-laut-bvergg2018/\n", "https://www.data.gv.at/daten/inspire/\n", "#\n", "https://www.data.gv.at/daten/ckan-apps/\n", "https://www.data.gv.at/daten/veroeffentlichende-stellen/\n", "https://www.data.gv.at/2021/06/09/neue-interaktive-visualisierung-verfuegbar-die-daten-von-data-gv-at/\n", "#\n", "https://www.data.gv.at/daten/anleitung-zur-datenveroeffentlichung/\n", "https://www.data.gv.at/daten/daten-hinzufuegen/\n" ] } ], "source": [ "for link in soup.find_all('a')[0:30]:\n", " print(link.get('href'))\n", " #print(link.text)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Now, rather than working with the entire soup, we can specify a new Beautiful Soup object. An example might be:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "nav = soup.nav" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Next, we can grab the links from just the nav bar:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "#\n", "https://www.data.gv.at/daten/\n", "https://www.data.gv.at/daten/\n", "/katalog/dataset/metadaten-von-ogd-osterreich\n", "#\n", "https://www.data.gv.at/daten/covid-19/\n", "https://www.data.gv.at/daten/ausschreibungen-laut-bvergg2018/\n", "https://www.data.gv.at/daten/inspire/\n", "#\n", "https://www.data.gv.at/daten/ckan-apps/\n", "https://www.data.gv.at/daten/veroeffentlichende-stellen/\n", "https://www.data.gv.at/2021/06/09/neue-interaktive-visualisierung-verfuegbar-die-daten-von-data-gv-at/\n", "#\n", "https://www.data.gv.at/daten/anleitung-zur-datenveroeffentlichung/\n", "https://www.data.gv.at/daten/daten-hinzufuegen/\n", "https://www.data.gv.at/applikationen/\n", "https://www.data.gv.at/applikationen/\n", "https://www.data.gv.at/applikationen/anwendung-einreichen/\n", "https://www.data.gv.at/infos/\n", "https://www.data.gv.at/infos/zielsetzung-data-gv-at/\n", "https://www.data.gv.at/infos/open-data-prinzipien/\n", "https://www.data.gv.at/infos/entwicklung-von-open-data/\n", "https://www.data.gv.at/infos/e-learning-module-zu-open-data/\n", "https://www.data.gv.at/infos/videos/\n", "#\n", "https://www.data.gv.at/infos/cooperation-ogd-oesterreich/\n", "https://www.data.gv.at/infos/ogd-d-a-ch-li/\n", "#\n", "https://www.data.gv.at/infos/bvergg2018/\n", "https://www.data.gv.at/infos/analyse/\n" ] } ], "source": [ "for url in nav.find_all('a')[0:30]:\n", " print(url.get('href'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this case, we're grabbing the first nav tags that we can find (the navigation bar). You could also go for soup.body to get the body section, then grab the .text from there:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Seitenbereiche\n", "\n" ] } ], "source": [ "body = soup.body\n", "for paragraph in body.find_all('p'):\n", " print(paragraph.text)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, sometimes there might be multiple tags with the same names, but different classes, and you might want to grab information from a specific tag with a specific class. For example, our page that we're working with has a div tag with the class of \"body\". We can work with this data like so:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "for div in soup.find_all('div', class_='header--social'):\n", " print(div)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "for div in soup.find_all('div', class_='header--menu'):\n", " print(div)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.1.3.4 - Extracting only *http* and *https* from *href* links" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "https://www.data.gv.at/suche/?typeFilter%5B0%5D=dataset\n", "https://www.data.gv.at/en/search/?typeFilter%5B0%5D=dataset\n", "https://mastodon.social/@datagvat\n", "https://twitter.com/datagvat\n", "https://www.facebook.com/groups/opendataaustria\n", "https://www.instagram.com/data.gv.at/\n", "https://www.data.gv.at/daten/\n", "https://www.data.gv.at/daten/\n", "https://www.data.gv.at/daten/covid-19/\n", "https://www.data.gv.at/daten/ausschreibungen-laut-bvergg2018/\n", "https://www.data.gv.at/daten/inspire/\n", "https://www.data.gv.at/daten/ckan-apps/\n", "https://www.data.gv.at/daten/veroeffentlichende-stellen/\n", "https://www.data.gv.at/2021/06/09/neue-interaktive-visualisierung-verfuegbar-die-daten-von-data-gv-at/\n", "https://www.data.gv.at/daten/anleitung-zur-datenveroeffentlichung/\n", "https://www.data.gv.at/daten/daten-hinzufuegen/\n", "https://www.data.gv.at/applikationen/\n", "https://www.data.gv.at/applikationen/\n", "https://www.data.gv.at/applikationen/anwendung-einreichen/\n", "https://www.data.gv.at/infos/\n", "https://www.data.gv.at/infos/zielsetzung-data-gv-at/\n", "https://www.data.gv.at/infos/open-data-prinzipien/\n", "https://www.data.gv.at/infos/entwicklung-von-open-data/\n", "https://www.data.gv.at/infos/e-learning-module-zu-open-data/\n", "https://www.data.gv.at/infos/videos/\n", "https://www.data.gv.at/infos/cooperation-ogd-oesterreich/\n", "https://www.data.gv.at/infos/ogd-d-a-ch-li/\n", "https://www.data.gv.at/infos/bvergg2018/\n", "https://www.data.gv.at/infos/analyse/\n", "https://www.data.gv.at/infos/governance/\n" ] } ], "source": [ "for link in soup.findAll('a', attrs={'href': re.compile(\"^http[s]?://\")})[0:30]:\n", " print(link.get('href'))" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "### 2.1.4 - Creating a small generic function to extract links:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "def getLinks(url):\n", " raw_page = requests.get(url)\n", " html_page = raw_page.text\n", " #html_page = urllib.request.urlopen(url)\n", " soup = bs(html_page)\n", " links = []\n", " for link in soup.findAll('a', attrs={'href': re.compile(\"^http[s]?://\")}):\n", " links.append(link.get('href'))\n", " return links" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['https://www.krone.at/', 'https://apps.apple.com/us/app/krone/id633492143?itsct=apps_box_badge&itscg=30200', 'https://play.google.com/store/apps/details?id=at.krone&pcampaignid=pcampaignidMKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1', 'https://vorteilswelt.krone.at/', 'https://service.krone.at/?23028&utm_source=krone.at&utm_medium=www&utm_campaign=StartseitenVerlinkung&utm_content=service', 'https://www.krone.at/epaper_weiche', 'https://www.krone.at/community', 'https://www.krone.at/gewinnspiele', 'https://www.krone.at', 'https://www.krone.at/kroneplus', 'https://www.krone.at/oesterreich', 'https://www.krone.at/bundeslaender', 'https://www.krone.at/politik', 'https://www.krone.at/ausland', 'https://www.krone.at/sport', 'https://www.krone.at/wm', 'https://www.krone.at/adabei', 'https://www.krone.at/digital', 'https://www.krone.at/weihnachts-extra', 'https://www.krone.at/motor', 'https://www.krone.at/wirtschaft', 'https://www.krone.at/wissenschaft', 'https://www.krone.at/gericht', 'https://www.krone.at/kolumnen', 'https://www.krone.at/freizeit', 'https://www.krone.at/tierecke', 'https://www.krone.at/gesund', 'https://www.krone.at/kultur', 'https://www.krone.at/kulinarik', 'https://www.krone.at/videos', 'https://www.krone.at/wm', 'https://www.krone.at/ticker/soccer/0/spielplan', 'https://www.krone.at/ticker/soccer/0/tabelle', 'https://www.krone.at/2854385', 'https://www.krone.at/2877502', 'https://www.krone.at/2877580', 'https://fan.at/wm-tippspiel?utm_source=krone&utm_campaign=wm-2022&utm_medium=bettinggame-teaser&utm_content=startpage', 'https://www.krone.at/2877626', 'https://www.krone.at/2877516', 'https://www.krone.at/2877263', 'https://www.krone.at/2877657', 'https://www.krone.at/2877626', 'https://www.krone.at/2877646', 'https://www.krone.at/2877654', 'https://www.krone.at/2877643', 'https://www.krone.at/2877627', 'https://www.krone.at/2877605', 'https://www.krone.at/2877636', 'https://www.krone.at/2877306', 'https://www.krone.at/2877383', 'https://www.krone.at/2877304', 'https://www.krone.at/2877525', 'https://www.krone.at/2877628', 'https://www.krone.at/2877624', 'https://www.krone.at/2877611', 'https://www.krone.at/2877610', 'https://www.krone.at/2877618', 'https://www.krone.at/2877601', 'https://www.krone.at/2877584', 'https://www.krone.at/2877588', 'https://www.krone.at/2877654', 'https://www.krone.at/2877539', 'https://www.krone.at/2877605', 'https://www.krone.at/weihnachts-extra', 'https://www.krone.at/2877318', 'https://www.krone.at/2877601', 'https://www.krone.at/2877531', 'https://www.krone.at/2877212', 'https://www.krone.at/2877566', 'https://www.krone.at/2877584', 'https://www.krone.at/oesterreich', 'https://www.krone.at/politik', 'https://www.krone.at/wirtschaft', 'https://www.krone.at/gericht', 'https://www.krone.at/wetter/oesterreich', 'https://www.krone.at/2877306', 'https://www.krone.at/2877611', 'https://www.krone.at/2877360', 'https://www.krone.at/2852734', 'https://www.krone.at/bundeslaender', 'https://www.krone.at/2877306', 'https://www.krone.at/2877383', 'https://www.krone.at/2877362', 'https://www.krone.at/2877525', 'https://www.krone.at/2877251', 'https://www.krone.at/2877556', 'https://www.krone.at/2877554', 'https://www.krone.at/2877205', 'https://www.krone.at/2877212', 'https://www.krone.at/2877389', 'https://www.krone.at/2877314', 'https://www.krone.at/2877321', 'https://www.krone.at/2877362', 'https://www.krone.at/2876519', 'https://www.krone.at/2877578', 'https://www.krone.at/2877516', 'https://www.krone.at/2877405', 'https://www.krone.at/2877463', 'https://www.krone.at/2877343', 'https://www.krone.at/2876602', 'https://www.krone.at/2877383', 'https://www.krone.at/2877461', 'https://www.krone.at/2877532', 'https://www.krone.at/2877551', 'https://www.krone.at/2877310', 'https://www.krone.at/2877360', 'https://www.krone.at/2877539', 'https://www.krone.at/2877455', 'https://www.krone.at/2877417', 'https://www.krone.at/2877576', 'https://www.krone.at/2877281', 'https://www.krone.at/2877537', 'https://www.krone.at/2877306', 'https://www.krone.at/2877611', 'https://www.krone.at/2877574', 'https://www.krone.at/2877174', 'https://www.krone.at/2877525', 'https://www.krone.at/2877485', 'https://www.krone.at/2877454', 'https://www.krone.at/2877089', 'https://www.krone.at/wien', 'https://www.krone.at/niederoesterreich', 'https://www.krone.at/oberoesterreich', 'https://www.krone.at/burgenland', 'https://www.krone.at/salzburg', 'https://www.krone.at/steiermark', 'https://www.krone.at/kaernten', 'https://www.krone.at/tirol', 'https://www.krone.at/vorarlberg', 'https://www.krone.at/politik', 'https://www.krone.at/2877383', 'https://www.krone.at/2877389', 'https://www.krone.at/ausland', 'https://www.krone.at/video-nachrichten', 'https://www.krone.at/wetter/welt', 'https://www.krone.at/2877582', 'https://www.krone.at/2877573', 'https://www.krone.at/2877359', 'https://www.krone.at/2877413', 'https://www.krone.at/sport', 'https://www.krone.at/fussball', 'https://www.krone.at/motorsport', 'https://www.krone.at/wintersport', 'https://www.krone.at/eishockey', 'https://www.krone.at/sport-mix', 'https://www.krone.at/2877657', 'https://www.krone.at/2877304', 'https://www.krone.at/2877525', 'https://www.krone.at/2877624', 'https://www.krone.at/adabei', 'https://www.krone.at/star-style', 'https://www.krone.at/hollywood', 'https://www.krone.at/royals', 'https://www.krone.at/video-adabei-tv', 'https://www.krone.at/2877645', 'https://www.krone.at/2877627', 'https://www.krone.at/2877610', 'https://www.krone.at/2875806', 'https://www.krone.at/digital', 'https://www.krone.at/web', 'https://www.krone.at/elektronik', 'https://www.krone.at/spiele', 'https://www.krone.at/2877646', 'https://www.krone.at/2877643', 'https://www.krone.at/2877636', 'https://www.krone.at/2876173', 'https://www.krone.at/shopping-tipps', 'https://www.krone.at/haushalt-garten', 'https://www.krone.at/sport-freizeit', 'https://www.krone.at/essen-trinken', 'https://www.krone.at/2874663', 'https://www.krone.at/2853911', 'https://www.krone.at/motor', 'https://www.krone.at/video-motor', 'http://anzeigen.krone.at/anzeigen/Auto_Motor/Autos/~__~/district/~~~/---~S7QytqrOtDI0NLJOtDIEMQ2ADCOr6mKghFJuZp6SdTGQq2RoAWKAhBIrkIRqa0F6DfHoNbBSQtUJFgDps7REaCsGMpQMQOIA/?', 'https://www.krone.at/2876947', 'https://www.krone.at/2876928', 'https://www.krone.at/wissenschaft', 'https://www.krone.at/2877177', 'https://www.krone.at/2876879', 'https://www.krone.at/gesund-fit', 'https://www.krone.at/2875563', 'https://www.krone.at/2876888', 'https://www.krone.at/musik', 'https://ticket.krone.at/de/home', 'https://www.krone.at/kolumnen', 'https://www.krone.at/2877556', 'https://www.krone.at/2876579', 'https://www.krone.at/medien', 'https://tv.krone.at', 'https://www.krone.at/leben', 'https://www.krone.at/2876845', 'https://www.krone.at/2870268', 'https://www.krone.at/reisen-urlaub', 'https://www.krone.at/zukunft', 'https://www.krone.at/2874406', 'https://www.krone.at/2876348', 'https://www.krone.at/community', 'https://www.krone.at/gewinnspiele', 'https://www.krone.at/2869270', 'https://www.krone.at/2876065', 'https://www.krone.at/star-style', 'https://www.krone.at/kulinarik', 'https://www.krone.at/2876528', 'https://www.krone.at/2877251', 'https://www.krone.at/ombudsfrau', 'https://www.krone.at/tierecke', 'https://www.krone.at/video-tierecke', 'https://www.krone.at/2875233', 'https://www.krone.at/2868104', 'https://www.krone.at/bauen-wohnen', 'https://www.dibeo.at/?utm_source=krone.at&utm_medium=referral&utm_campaign=krone-header', 'https://www.krone.at/viral', 'https://www.krone.at/video-viral', 'https://www.krone.at/2874839', 'https://www.krone.at/2876885', 'http://bit.ly/3AFfWzS', 'https://www.krone.at/2876409', 'https://www.krone.at/2876409', 'https://www.krone.at/2875959', 'https://www.krone.at/2874733', 'https://www.krone.at/2876025', 'https://www.krone.at/2877318', 'https://www.krone.at/2876581', 'https://www.krone.at/2876158', 'https://ticket.krone.at/de/advent?utm_source=XmasSpecial&utm_medium=randspalte&utm_campaign=Adventaktion2020', 'https://www.krone.at/videos', 'https://www.krone.at/2877101', 'https://www.krone.at/2877628', 'https://pubads.g.doubleclick.net/gampad/clk?id=5849865560&iu=/6771346/clicktracking.krone.at/clicktracking.krone.at_navi-header', 'https://jackpot.onelink.me/1833068633/d1d6df19', 'https://www.krone.at/games-bubble-shooter', 'https://www.krone.at/games-kartenspiele', 'https://www.krone.at/kreuzwortraetsel', 'https://www.krone.at/sudoku', 'https://www.krone.at/das-freie-wort', 'https://www.krone.at/vergleich/', 'https://www.krone.at/vergleich/dampfgarer-test/', 'https://www.krone.at/vergleich/einbaukuehlschrank-test/', 'https://www.krone.at/vergleich/staubsauger-test/', 'https://www.krone.at/vergleich/friteuse-test/', 'https://www.krone.at/vergleich/gefrierschrank-test/', 'https://www.krone.at/vergleich/geschirrspueler-test/', 'https://www.krone.at/vergleich/induktionsherd-test/', 'https://www.krone.at/vergleich/kaffeemaschine-test/', 'https://www.krone.at/vergleich/akku-staubsauger-test/', 'https://www.krone.at/vergleich/kuechenmaschine-test/', 'https://www.krone.at/vergleich/', 'https://www.krone.at/gutschein/', 'https://www.krone.at/gutschein/otto?utm_source=krone&utm_medium=textlink&utm_campaign=widget', 'https://www.krone.at/gutschein/eis?utm_source=krone&utm_medium=textlink&utm_campaign=widget', 'https://www.krone.at/gutschein/deichmann?utm_source=krone&utm_medium=textlink&utm_campaign=widget', 'https://www.krone.at/gutschein/moemax?utm_source=krone&utm_medium=textlink&utm_campaign=widget', 'https://www.krone.at/gutschein/gutscheinkalender?utm_source=krone&utm_medium=textlink&utm_campaign=widget', 'https://www.krone.at/newsletter', 'https://www.krone.at/newsletter', 'https://www.krone.at/video-tv-programm', 'https://www.krone.at/videos', 'https://vorteilswelt.krone.at/', 'https://service.krone.at/?23028&utm_source=krone.at&utm_medium=www&utm_campaign=StartseitenVerlinkung&utm_content=service', 'https://vorteilswelt.krone.at/?23028&utm_source=krone.at&utm_medium=www&utm_campaign=StartseitenVerlinkung&utm_content=kundenbindung', 'https://www.krone.at/epaper_weiche', 'https://www.krone.at/gewinnspiele', 'https://www.krone.at/community', 'https://www.krone.at/580415', 'https://www.krone.at/392364', 'https://www.krone.at/sales', 'https://www.krone.at/434475', 'https://www.krone.at/1704878', 'https://www.krone.at/37371', 'https://www.krone.at/37371', 'https://www.facebook.com/krone.at', 'https://www.twitter.com/krone_at', 'https://www.youtube.com/user/kronetv', 'https://www.instagram.com/kronen.zeitung']\n" ] } ], "source": [ "print(getLinks(\"https://www.krone.at/\"))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.1.5 - Extracting information from tables" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "url3 = urllib.request.urlopen('https://pythonprogramming.net/parsememcparseface/').read()\n", "soup = bs(url3,'lxml')" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "table = soup.table\n", "#table = soup.find('table')" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "table_rows = table.find_all('tr')" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[]\n", "['Python', '932914021', 'Definitely']\n", "['Pascal', '532', 'Unlikely']\n", "['Lisp', '1522', 'Uncertain']\n", "['D#', '12', 'Possibly']\n", "['Cobol', '3', 'No.']\n", "['Fortran', '52124', 'Yes.']\n", "['Haskell', '24', 'lol.']\n" ] } ], "source": [ "for tr in table_rows:\n", " td = tr.find_all('td')\n", " row = [i.text for i in td]\n", " print(row)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "***\n", "\n", "### 3 - Parsing dynamically updated data via javascript" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[General Info](https://stackoverflow.com/questions/8049520/web-scraping-javascript-page-with-python) \n", "[Selenium](https://www.selenium.dev/) \n", "[Dry Scape](https://dryscrape.readthedocs.io/en/latest/) " ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "200\n" ] } ], "source": [ "url4 = \"https://kurier.at/\"\n", "content = requests.get(url4)\n", "print(content.status_code)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "***\n", "\n", "### 4 - Using Requests with Parameters\n", "\n", "[Example](https://towardsdatascience.com/web-scraping-101-in-python-35f8653b1c97) of using [parameters with *requests*](https://docs.python-requests.org/en/master/user/quickstart/) on [IMDB](https://www.imdb.com/search/title/?count=100&groups=top_1000&sort=user_rating):" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "After taking a look at the IMDB webpage, we’ll set out to extract (all highlighted in the above screenshot of the page):\n", "\n", "+ Movie title\n", "+ Release year\n", "+ Runtime\n", "+ Audience rating\n", "+ Genre\n", "+ IMDB rating\n", "+ Number of votes\n", "+ Box office earnings\n", "+ Director\n", "+ Primary actors" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [], "source": [ "url3 = 'https://www.imdb.com/search/title/?count=100&groups=top_1000&sort=user_rating'\n", "\n", "def get_page_contents(url):\n", " page = requests.get(url, headers={\"Accept-Language\": \"en-US\"})\n", " return bs(page.text, \"html.parser\")\n", "\n", "soup = get_page_contents(url3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Extracting text: Movie titles and release year\n", "\n", "Since we’ve already located the HTML tag containing each movie card, we can get a list of all distinct movies and their corresponding HTML by:" ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[

\n", " 1.\n", " The Shawshank Redemption\n", " (1994)\n", "

,\n", "

\n", " 2.\n", " The Godfather\n", " (1972)\n", "

,\n", "

\n", " 3.\n", " The Dark Knight\n", " (2008)\n", "

,\n", "

\n", " 4.\n", " The Lord of the Rings: The Return of the King\n", " (2003)\n", "

,\n", "

\n", " 5.\n", " Schindler's List\n", " (1993)\n", "

]" ] }, "execution_count": 114, "metadata": {}, "output_type": "execute_result" } ], "source": [ "movies = soup.findAll('h3', class_='lister-item-header') \n", "movies[0:5]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The findAll method creates a list where each entry contains the HTML that’s captured within the h3 tag and list-item-header class. \n", "By taking a deeper look at the first movies HTML and see that the movie title can be found under the first a tag.\n", "\n", "To capture this attribute we can loop through all movies and either call findAll and grab the first element of the list, or we can use the find method which automatically grabs the first tag it finds. Thus, we can construct a list of all movie titles (with a little help from list comprehensions for efficiency) through:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Jai Bhim',\n", " 'The Shawshank Redemption',\n", " 'The Godfather',\n", " 'Soorarai Pottru',\n", " 'The Dark Knight',\n", " 'The Godfather: Part II',\n", " '12 Angry Men',\n", " 'The Lord of the Rings: The Return of the King',\n", " 'Pulp Fiction',\n", " \"Schindler's List\"]" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titles = [movie.find('a').text for movie in movies]\n", "titles[0:10]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Release years can be found under the tag span and class lister-item-year text-muted unbold. To grab these, we can follow a similar approach as before:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['(2021)',\n", " '(1994)',\n", " '(1972)',\n", " '(2020)',\n", " '(2008)',\n", " '(1974)',\n", " '(1957)',\n", " '(2003)',\n", " '(1994)',\n", " '(1993)']" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "release = [movie.find('span', class_='lister-item-year text-muted unbold').text for movie in movies]\n", "release[0:10]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Extracting Numerical Values:\n", "\n", "In the case of IMDB ratings, number of votes and box office earnings we can see that while these may be available as string values, can also grab the actual numerical values from the data-value attribute within each respective tag.\n", "\n", "Here’s the IMDB rating of The Godfather: \n", "\\
" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'9.3'" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soup.find('div', class_='inline-block ratings-imdb-rating')['data-value']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the case of number of votes and earnings we don’t have a class attribute to filter for. Here are the number of votes and estimated box office earnings:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['166955', '2524608', '28,341,469', '1738105', '134,966,411', '105969', '2474861', '534,858,444', '1206022', '57,300,000', '745533', '4,360,000', '1742556', '377,845,905', '1945178', '107,928,762', '1290110', '96,898,818', '2219102', '292,576,195', '381254', '34422', '1985641', '37,030,102', '1763818', '315,544,750', '1948453', '330,252,182', '729757', '6,100,000', '80169', '111744', '1574783', '342,551,365', '1819851', '171,479,930', '1092313', '46,836,394', '1226372', '290,475,067', '968073', '112,000,000', '704737', '53,367,844', '33253', '1670884', '188,020,017', '731227', '7,563,397', '711808', '10,055,859', '1318236', '216,540,909', '1228259', '136,801,374', '664080', '57,598,247', '1549651', '100,125,643', '1357805', '130,742,922', '1297940', '322,740,140', '51376', '333835', '269,061', '437425', '27144', '784073', '13,092,000', '813495', '13,182,281', '1268744', '53,089,891', '1262628', '132,384,315', '787132', '32,572,577', '1426161', '187,705,427', '1081233', '6,719,864', '1044282', '23,341,568', '1103636', '19,501,238', '1002551', '422,783,777', '1050193', '204,843,350', '249906', '11,990,401', '259173', '1136081', '210,609,762', '318833', '5,321,508', '642033', '32,000,000', '473008', '36,764,313', '550923', '1,024,560', '232696', '163,245', '178698', '19,181', '80529', '80141', '1,661,096', '1126129', '335,451,311', '37320', '37822', '236671', '5,017,246', '176504', '12,391,761', '460477', '190,241,310', '993360', '858,373,000', '966948', '678,815,482', '453653', '209,726,015', '1459854', '162,805,434', '1607516', '448,139,099', '375858', '6,532,908', '184301', '1,223,869', '1061740', '223,808,164', '377926', '11,286,112', '551409', '707,481', '1187303', '25,544,867', '372970', '2,375,308', '930103', '248,159,971', '964675', '44,017,374', '640271', '83,471,511', '838483', '78,900,000', '41116', '473614', '275,902', '119338', '8,175,000', '190087', '30035', '536,364', '214280', '216460', '288,475', '46927', '898,575', '522938', '159,227,644', '54677', '4,186,168', '39268', '52258', '35364', '39058', '311464', '687,185', '235572', '7,098,492', '167495', '6,857,096']\n" ] } ], "source": [ "votes_earnings = soup.findAll('span', {'name':'nv'})\n", "print([ve['data-value'] for ve in votes_earnings])" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['166955', '28,341,469', '134,966,411', '2474861', '1206022']\n", "['2524608', '1738105', '105969', '534,858,444', '57,300,000']\n" ] } ], "source": [ "votes = []\n", "earnings = []\n", "idx = 0\n", "while idx < len(votes_earnings)-1:\n", " votes.append(votes_earnings[idx]['data-value'])\n", " earnings.append(votes_earnings[idx+1]['data-value'])\n", " idx+=2\n", "print(votes[0:5])\n", "print(earnings[0:5])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nested Values\n", "\n", "In the case where the data we need is located within multiple levels of generic tags, we’ll need to dig into this nested structure to extract what we need.\n", "\n", "In the case of the movie directors and actors we’ll need to do just that. From inspecting the HTML we see that the director information is located within an initial p tag and thereafter an a tag — both without class attributes making it necessary to unnest the data. We’ll do this by calling find and findAll repeatedly.\n", "\n", "Since the director is the 1st a tag, we can extract this information through:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "---\n", "IMDb Top 250 Movies chart\n", "IMDb Top 250 Movies chart\n", "---\n", "T.J. Gnanavel\n", "T.J. Gnanavel\n", "Suriya\n", "Suriya\n", "Lijo Mol Jose\n", "Lijo Mol Jose\n", "Manikandan\n", "Manikandan\n", "Rajisha Vijayan\n", "Rajisha Vijayan\n", "---\n", "Frank Darabont\n", "Frank Darabont\n", "Tim Robbins\n", "Tim Robbins\n", "Morgan Freeman\n", "Morgan Freeman\n", "Bob Gunton\n", "Bob Gunton\n", "William Sadler\n", "William Sadler\n" ] } ], "source": [ "for l1 in soup.findAll('p')[0:10]:\n", " if l1.find('a'):\n", " print('---')\n", " for l2 in l1.findAll('a'):\n", " print(l2)\n", " print(l2.text)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "actors = [actor.text for actor in soup.findAll('p')[2].findAll('a')]\n", "actors" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Creating functions to automate information scraping on IMDB:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "def numeric_value(movie, tag, class_=None, order=None):\n", " if order:\n", " if len(movie.findAll(tag, class_)) > 1:\n", " to_extract = movie.findAll(tag, class_)[order]['data-value']\n", " else:\n", " to_extract = None\n", " else:\n", " to_extract = movie.find(tag, class_)['data-value']\n", "\n", " return to_extract\n", "\n", "\n", "def text_value(movie, tag, class_=None):\n", " if movie.find(tag, class_):\n", " return movie.find(tag, class_).text\n", " else:\n", " return\n", "\n", "\n", "def nested_text_value(movie, tag_1, class_1, tag_2, class_2, order=None):\n", " if not order:\n", " return movie.find(tag_1, class_1).find(tag_2, class_2).text\n", " else:\n", " return [val.text for val in movie.find(tag_1, class_1).findAll(tag_2, class_2)[order]]\n", "\n", "\n", "def extract_attribute(soup, tag_1, class_1='', tag_2='', class_2='',\n", " text_attribute=True, order=None, nested=False):\n", " movies = soup.findAll('div', class_='lister-item-content')\n", " data_list = []\n", " for movie in movies:\n", " if text_attribute:\n", " if nested:\n", " data_list.append(nested_text_value(movie, tag_1, class_1, tag_2, class_2, order))\n", " else:\n", " data_list.append(text_value(movie, tag_1, class_1))\n", " else:\n", " data_list.append(numeric_value(movie, tag_1, class_1, order))\n", "\n", " return data_list" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Creating a Dataframe with the information" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
TitleReleaseAudience RatingRuntimeGenreIMDB RatingVotesBox Office EarningsDirectorActors
0Jai Bhim(2021)TV-MA164 min\\nCrime, Drama\\n\\n9.3\\n166,955166,955T.J. Gnanavel[Suriya, Lijo Mol Jose, Manikandan, Rajisha Vi...
1The Shawshank Redemption(1994)R142 min\\nDrama\\n\\n9.3\\n2,524,6082,524,608Frank Darabont[Tim Robbins, Morgan Freeman, Bob Gunton, Will...
2The Godfather(1972)R175 min\\nCrime, Drama\\n\\n9.2\\n1,738,1051,738,105Francis Ford Coppola[Marlon Brando, Al Pacino, James Caan, Diane K...
3Soorarai Pottru(2020)TV-MA153 min\\nDrama\\n\\n9.1\\n105,969105,969Sudha Kongara[Suriya, Paresh Rawal, Urvashi, Aparna Balamur...
4The Dark Knight(2008)PG-13152 min\\nAction, Crime, Drama\\n\\n9.0\\n2,474,8612,474,861Christopher Nolan[Christian Bale, Heath Ledger, Aaron Eckhart, ...
\n", "
" ], "text/plain": [ " Title Release Audience Rating Runtime \\\n", "0 Jai Bhim (2021) TV-MA 164 min \n", "1 The Shawshank Redemption (1994) R 142 min \n", "2 The Godfather (1972) R 175 min \n", "3 Soorarai Pottru (2020) TV-MA 153 min \n", "4 The Dark Knight (2008) PG-13 152 min \n", "\n", " Genre IMDB Rating Votes \\\n", "0 \\nCrime, Drama \\n\\n9.3\\n 166,955 \n", "1 \\nDrama \\n\\n9.3\\n 2,524,608 \n", "2 \\nCrime, Drama \\n\\n9.2\\n 1,738,105 \n", "3 \\nDrama \\n\\n9.1\\n 105,969 \n", "4 \\nAction, Crime, Drama \\n\\n9.0\\n 2,474,861 \n", "\n", " Box Office Earnings Director \\\n", "0 166,955 T.J. Gnanavel \n", "1 2,524,608 Frank Darabont \n", "2 1,738,105 Francis Ford Coppola \n", "3 105,969 Sudha Kongara \n", "4 2,474,861 Christopher Nolan \n", "\n", " Actors \n", "0 [Suriya, Lijo Mol Jose, Manikandan, Rajisha Vi... \n", "1 [Tim Robbins, Morgan Freeman, Bob Gunton, Will... \n", "2 [Marlon Brando, Al Pacino, James Caan, Diane K... \n", "3 [Suriya, Paresh Rawal, Urvashi, Aparna Balamur... \n", "4 [Christian Bale, Heath Ledger, Aaron Eckhart, ... " ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titles = extract_attribute(soup, 'a')\n", "release = extract_attribute(soup, 'span', 'lister-item-year text-muted unbold')\n", "audience_rating = extract_attribute(soup, 'span', 'certificate')\n", "runtime = extract_attribute(soup, 'span', 'runtime')\n", "genre = extract_attribute(soup, 'span', 'genre')\n", "imdb_rating = extract_attribute(soup, 'div', 'inline-block ratings-imdb-rating', False)\n", "votes = extract_attribute(soup, 'span' , {'name' : 'nv'}, False, 0)\n", "earnings = extract_attribute(soup, 'span' , {'name' : 'nv'}, False, 1)\n", "directors = extract_attribute(soup, 'p', '', 'a', '', True, 0, True)\n", "actors = extract_attribute(soup, 'p', '', 'a', '', True, slice(1, 5, None), True)\n", "\n", "\n", "df_dict = {'Title': titles, 'Release': release, 'Audience Rating': audience_rating,\n", " 'Runtime': runtime, 'Genre': genre, 'IMDB Rating': imdb_rating,\n", " 'Votes': votes, 'Box Office Earnings': earnings, 'Director': directors,\n", " 'Actors': actors}\n", "\n", "df = pd.DataFrame(df_dict)\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Manually creating a Dataframe and starting analysis" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "url4 = \"http://www.hubertiming.com/results/2017GPTR10K\"\n", "html = urllib.request.urlopen(url4)\n", "soup = bs(html, 'lxml')" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Race results for the 2017 Intel Great Place to Run \\ Urban Clash Games!\n" ] } ], "source": [ "# Get the title\n", "title = soup.title\n", "print(title)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'\\n\\n\\n\\n\\n\\n\\nRace results for the 2017 Intel Great Place to Run \\\\ Urban Clash Games!\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n 2017 Intel Great Place to Run 10K \\\\ Urban Clash Games\\n Hillsboro Stadium, Hillsboro, OR \\n June 2nd,'" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Print out the text\n", "text = soup.get_text()\n", "text[0:200]" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[timing@hubertiming.com,\n", " Huber Timing Home,\n", " 5K Individual,\n", " 5K Team,\n", " 10K Team,\n", " Summary,\n", " ,\n", " 10K Results,\n", " Huber Timing,\n", " ,\n", " Dark Mode]" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soup.find_all('a')" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "mailto:timing@hubertiming.com\n", "https://www.hubertiming.com\n", "/results/2017GPTR\n", "/results/team/2017GPTR\n", "/results/team/2017GPTR10K\n", "/results/summary/2017GPTR10K\n", "None\n", "#tabs-1\n", "https://www.hubertiming.com/\n", "https://facebook.com/hubertiming/\n", "None\n" ] } ], "source": [ "all_links = soup.find_all(\"a\")\n", "for link in all_links:\n", " print(link.get(\"href\"))" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[\n", "10K:\n", ", \n", "Finishers:\n", "577\n", ", \n", "Male:\n", "414\n", ", \n", "Female:\n", "163\n", ", \n", "Place\n", "Bib\n", "Name\n", "Gender\n", "City\n", "Chip Time\n", "Gun Time\n", "Team\n", ", \n", "1\n", "814\n", "\n", "\n", " JARED WILSON\n", "\n", " \n", "M\n", "TIGARD\n", "36:21\n", "36:24\n", "\n", ", \n", "2\n", "573\n", "\n", "\n", " NATHAN A SUSTERSIC\n", "\n", " \n", "M\n", "PORTLAND\n", "36:42\n", "36:45\n", "\n", "\n", " INTEL TEAM F\n", " \n", ", \n", "3\n", "687\n", "\n", "\n", " FRANCISCO MAYA\n", "\n", " \n", "M\n", "PORTLAND\n", "37:44\n", "37:48\n", "\n", "]\n" ] } ], "source": [ "# Print the first 8 rows for sanity check\n", "rows = soup.find_all('tr')\n", "print(rows[:8])" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[577, 443, \n", "\n", " LIBBY B MITCHELL\n", "\n", " , F, HILLSBORO, 1:41:18, 1:42:10, ]\n" ] }, { "data": { "text/plain": [ "bs4.element.ResultSet" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "for row in rows:\n", " row_td = row.find_all('td')\n", "print(row_td)\n", "type(row_td)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[577, 443, \n", "\n", " LIBBY B MITCHELL\n", "\n", " , F, HILLSBORO, 1:41:18, 1:42:10, ]\n" ] } ], "source": [ "str_cells = str(row_td)\n", "cleantext = bs(str_cells, \"lxml\").get_text()\n", "print(cleantext)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Now processing the whole page" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[577, 443, \n", "\n", " LIBBY B MITCHELL\n", "\n", " , F, HILLSBORO, 1:41:18, 1:42:10, ]\n" ] }, { "data": { "text/plain": [ "str" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list_rows = []\n", "for row in rows:\n", " cells = row.find_all('td')\n", " str_cells = str(cells)\n", " clean = re.compile('<.*?>')\n", " clean2 = (re.sub(clean, '',str_cells))\n", " list_rows.append(clean2)\n", "print(clean2)\n", "type(clean2)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
raw
0[]
1[Finishers:, 577]
2[Male:, 414]
3[Female:, 163]
4[]
5[1, 814, \\r\\n\\r\\n JARED WIL...
6[2, 573, \\r\\n\\r\\n NATHAN A ...
7[3, 687, \\r\\n\\r\\n FRANCISCO...
8[4, 623, \\r\\n\\r\\n PAUL MORR...
9[5, 569, \\r\\n\\r\\n DEREK G O...
\n", "
" ], "text/plain": [ " raw\n", "0 []\n", "1 [Finishers:, 577]\n", "2 [Male:, 414]\n", "3 [Female:, 163]\n", "4 []\n", "5 [1, 814, \\r\\n\\r\\n JARED WIL...\n", "6 [2, 573, \\r\\n\\r\\n NATHAN A ...\n", "7 [3, 687, \\r\\n\\r\\n FRANCISCO...\n", "8 [4, 623, \\r\\n\\r\\n PAUL MORR...\n", "9 [5, 569, \\r\\n\\r\\n DEREK G O..." ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(list_rows, columns=['raw'])\n", "df.head(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Cleaning the fields" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
01234567
0[]NoneNoneNoneNoneNoneNoneNone
1[Finishers:577]NoneNoneNoneNoneNoneNone
2[Male:414]NoneNoneNoneNoneNoneNone
3[Female:163]NoneNoneNoneNoneNoneNone
4[]NoneNoneNoneNoneNoneNoneNone
5[1814\\r\\n\\r\\n JARED WILSON\\r\\n\\...MTIGARD36:2136:24]
6[2573\\r\\n\\r\\n NATHAN A SUSTERSI...MPORTLAND36:4236:45\\n\\r\\n INTEL TEAM ...
7[3687\\r\\n\\r\\n FRANCISCO MAYA\\r\\...MPORTLAND37:4437:48]
8[4623\\r\\n\\r\\n PAUL MORROW\\r\\n\\r...MBEAVERTON38:3438:37]
9[5569\\r\\n\\r\\n DEREK G OSBORNE\\r...MHILLSBORO39:2139:24\\n\\r\\n INTEL TEAM ...
\n", "
" ], "text/plain": [ " 0 1 2 \\\n", "0 [] None None \n", "1 [Finishers: 577] None \n", "2 [Male: 414] None \n", "3 [Female: 163] None \n", "4 [] None None \n", "5 [1 814 \\r\\n\\r\\n JARED WILSON\\r\\n\\... \n", "6 [2 573 \\r\\n\\r\\n NATHAN A SUSTERSI... \n", "7 [3 687 \\r\\n\\r\\n FRANCISCO MAYA\\r\\... \n", "8 [4 623 \\r\\n\\r\\n PAUL MORROW\\r\\n\\r... \n", "9 [5 569 \\r\\n\\r\\n DEREK G OSBORNE\\r... \n", "\n", " 3 4 5 6 \\\n", "0 None None None None \n", "1 None None None None \n", "2 None None None None \n", "3 None None None None \n", "4 None None None None \n", "5 M TIGARD 36:21 36:24 \n", "6 M PORTLAND 36:42 36:45 \n", "7 M PORTLAND 37:44 37:48 \n", "8 M BEAVERTON 38:34 38:37 \n", "9 M HILLSBORO 39:21 39:24 \n", "\n", " 7 \n", "0 None \n", "1 None \n", "2 None \n", "3 None \n", "4 None \n", "5 ] \n", "6 \\n\\r\\n INTEL TEAM ... \n", "7 ] \n", "8 ] \n", "9 \\n\\r\\n INTEL TEAM ... " ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1 = df['raw'].str.split(',', expand=True)\n", "df1.head(10)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
01234567
0]NoneNoneNoneNoneNoneNoneNone
1Finishers:577]NoneNoneNoneNoneNoneNone
2Male:414]NoneNoneNoneNoneNoneNone
3Female:163]NoneNoneNoneNoneNoneNone
4]NoneNoneNoneNoneNoneNoneNone
51814\\r\\n\\r\\n JARED WILSON\\r\\n\\...MTIGARD36:2136:24]
62573\\r\\n\\r\\n NATHAN A SUSTERSI...MPORTLAND36:4236:45\\n\\r\\n INTEL TEAM ...
73687\\r\\n\\r\\n FRANCISCO MAYA\\r\\...MPORTLAND37:4437:48]
84623\\r\\n\\r\\n PAUL MORROW\\r\\n\\r...MBEAVERTON38:3438:37]
95569\\r\\n\\r\\n DEREK G OSBORNE\\r...MHILLSBORO39:2139:24\\n\\r\\n INTEL TEAM ...
\n", "
" ], "text/plain": [ " 0 1 2 3 \\\n", "0 ] None None None \n", "1 Finishers: 577] None None \n", "2 Male: 414] None None \n", "3 Female: 163] None None \n", "4 ] None None None \n", "5 1 814 \\r\\n\\r\\n JARED WILSON\\r\\n\\... M \n", "6 2 573 \\r\\n\\r\\n NATHAN A SUSTERSI... M \n", "7 3 687 \\r\\n\\r\\n FRANCISCO MAYA\\r\\... M \n", "8 4 623 \\r\\n\\r\\n PAUL MORROW\\r\\n\\r... M \n", "9 5 569 \\r\\n\\r\\n DEREK G OSBORNE\\r... M \n", "\n", " 4 5 6 \\\n", "0 None None None \n", "1 None None None \n", "2 None None None \n", "3 None None None \n", "4 None None None \n", "5 TIGARD 36:21 36:24 \n", "6 PORTLAND 36:42 36:45 \n", "7 PORTLAND 37:44 37:48 \n", "8 BEAVERTON 38:34 38:37 \n", "9 HILLSBORO 39:21 39:24 \n", "\n", " 7 \n", "0 None \n", "1 None \n", "2 None \n", "3 None \n", "4 None \n", "5 ] \n", "6 \\n\\r\\n INTEL TEAM ... \n", "7 ] \n", "8 ] \n", "9 \\n\\r\\n INTEL TEAM ... " ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1[0] = df1[0].str.strip('[')\n", "df1.head(10)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "col_labels = soup.find_all('th')" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['[Place, Bib, Name, Gender, City, Chip Time, Gun Time, Team]']\n" ] } ], "source": [ "all_header = []\n", "col_str = str(col_labels)\n", "cleantext2 = bs(col_str, \"lxml\").get_text()\n", "all_header.append(cleantext2)\n", "print(all_header)" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0
0[Place, Bib, Name, Gender, City, Chip Time, Gu...
\n", "
" ], "text/plain": [ " 0\n", "0 [Place, Bib, Name, Gender, City, Chip Time, Gu..." ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2 = pd.DataFrame(all_header)\n", "df2.head()" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
01234567
0[PlaceBibNameGenderCityChip TimeGun TimeTeam]
\n", "
" ], "text/plain": [ " 0 1 2 3 4 5 6 7\n", "0 [Place Bib Name Gender City Chip Time Gun Time Team]" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df3 = df2[0].str.split(',', expand=True)\n", "df3.head()" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
01234567
0[PlaceBibNameGenderCityChip TimeGun TimeTeam]
0]NoneNoneNoneNoneNoneNoneNone
1Finishers:577]NoneNoneNoneNoneNoneNone
2Male:414]NoneNoneNoneNoneNoneNone
3Female:163]NoneNoneNoneNoneNoneNone
4]NoneNoneNoneNoneNoneNoneNone
51814\\r\\n\\r\\n JARED WILSON\\r\\n\\...MTIGARD36:2136:24]
62573\\r\\n\\r\\n NATHAN A SUSTERSI...MPORTLAND36:4236:45\\n\\r\\n INTEL TEAM ...
73687\\r\\n\\r\\n FRANCISCO MAYA\\r\\...MPORTLAND37:4437:48]
84623\\r\\n\\r\\n PAUL MORROW\\r\\n\\r...MBEAVERTON38:3438:37]
\n", "
" ], "text/plain": [ " 0 1 2 \\\n", "0 [Place Bib Name \n", "0 ] None None \n", "1 Finishers: 577] None \n", "2 Male: 414] None \n", "3 Female: 163] None \n", "4 ] None None \n", "5 1 814 \\r\\n\\r\\n JARED WILSON\\r\\n\\... \n", "6 2 573 \\r\\n\\r\\n NATHAN A SUSTERSI... \n", "7 3 687 \\r\\n\\r\\n FRANCISCO MAYA\\r\\... \n", "8 4 623 \\r\\n\\r\\n PAUL MORROW\\r\\n\\r... \n", "\n", " 3 4 5 6 \\\n", "0 Gender City Chip Time Gun Time \n", "0 None None None None \n", "1 None None None None \n", "2 None None None None \n", "3 None None None None \n", "4 None None None None \n", "5 M TIGARD 36:21 36:24 \n", "6 M PORTLAND 36:42 36:45 \n", "7 M PORTLAND 37:44 37:48 \n", "8 M BEAVERTON 38:34 38:37 \n", "\n", " 7 \n", "0 Team] \n", "0 None \n", "1 None \n", "2 None \n", "3 None \n", "4 None \n", "5 ] \n", "6 \\n\\r\\n INTEL TEAM ... \n", "7 ] \n", "8 ] " ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "frames = [df3, df1]\n", "\n", "df4 = pd.concat(frames)\n", "df4.head(10)" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
[PlaceBibNameGenderCityChip TimeGun TimeTeam]
0[PlaceBibNameGenderCityChip TimeGun TimeTeam]
0]NoneNoneNoneNoneNoneNoneNone
1Finishers:577]NoneNoneNoneNoneNoneNone
2Male:414]NoneNoneNoneNoneNoneNone
3Female:163]NoneNoneNoneNoneNoneNone
\n", "
" ], "text/plain": [ " [Place Bib Name Gender City Chip Time Gun Time Team]\n", "0 [Place Bib Name Gender City Chip Time Gun Time Team]\n", "0 ] None None None None None None None\n", "1 Finishers: 577] None None None None None None\n", "2 Male: 414] None None None None None None\n", "3 Female: 163] None None None None None None" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df5 = df4.rename(columns=df4.iloc[0])\n", "df5.head()" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Int64Index: 583 entries, 0 to 581\n", "Data columns (total 8 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 [Place 583 non-null object\n", " 1 Bib 581 non-null object\n", " 2 Name 578 non-null object\n", " 3 Gender 578 non-null object\n", " 4 City 578 non-null object\n", " 5 Chip Time 578 non-null object\n", " 6 Gun Time 578 non-null object\n", " 7 Team] 578 non-null object\n", "dtypes: object(8)\n", "memory usage: 41.0+ KB\n" ] }, { "data": { "text/plain": [ "(583, 8)" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df5.info()\n", "df5.shape" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [], "source": [ "df6 = df5.dropna(axis=0, how='any')" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
[PlaceBibNameGenderCityChip TimeGun TimeTeam]
51814\\r\\n\\r\\n JARED WILSON\\r\\n\\...MTIGARD36:2136:24]
62573\\r\\n\\r\\n NATHAN A SUSTERSI...MPORTLAND36:4236:45\\n\\r\\n INTEL TEAM ...
73687\\r\\n\\r\\n FRANCISCO MAYA\\r\\...MPORTLAND37:4437:48]
84623\\r\\n\\r\\n PAUL MORROW\\r\\n\\r...MBEAVERTON38:3438:37]
95569\\r\\n\\r\\n DEREK G OSBORNE\\r...MHILLSBORO39:2139:24\\n\\r\\n INTEL TEAM ...
\n", "
" ], "text/plain": [ " [Place Bib Name Gender \\\n", "5 1 814 \\r\\n\\r\\n JARED WILSON\\r\\n\\... M \n", "6 2 573 \\r\\n\\r\\n NATHAN A SUSTERSI... M \n", "7 3 687 \\r\\n\\r\\n FRANCISCO MAYA\\r\\... M \n", "8 4 623 \\r\\n\\r\\n PAUL MORROW\\r\\n\\r... M \n", "9 5 569 \\r\\n\\r\\n DEREK G OSBORNE\\r... M \n", "\n", " City Chip Time Gun Time \\\n", "5 TIGARD 36:21 36:24 \n", "6 PORTLAND 36:42 36:45 \n", "7 PORTLAND 37:44 37:48 \n", "8 BEAVERTON 38:34 38:37 \n", "9 HILLSBORO 39:21 39:24 \n", "\n", " Team] \n", "5 ] \n", "6 \\n\\r\\n INTEL TEAM ... \n", "7 ] \n", "8 ] \n", "9 \\n\\r\\n INTEL TEAM ... " ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df7 = df6.drop(df6.index[0])\n", "df7.head()" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PlaceBibNameGenderCityChip TimeGun TimeTeam
51814\\r\\n\\r\\n JARED WILSON\\r\\n\\...MTIGARD36:2136:24]
62573\\r\\n\\r\\n NATHAN A SUSTERSI...MPORTLAND36:4236:45\\n\\r\\n INTEL TEAM ...
73687\\r\\n\\r\\n FRANCISCO MAYA\\r\\...MPORTLAND37:4437:48]
84623\\r\\n\\r\\n PAUL MORROW\\r\\n\\r...MBEAVERTON38:3438:37]
95569\\r\\n\\r\\n DEREK G OSBORNE\\r...MHILLSBORO39:2139:24\\n\\r\\n INTEL TEAM ...
\n", "
" ], "text/plain": [ " Place Bib Name Gender \\\n", "5 1 814 \\r\\n\\r\\n JARED WILSON\\r\\n\\... M \n", "6 2 573 \\r\\n\\r\\n NATHAN A SUSTERSI... M \n", "7 3 687 \\r\\n\\r\\n FRANCISCO MAYA\\r\\... M \n", "8 4 623 \\r\\n\\r\\n PAUL MORROW\\r\\n\\r... M \n", "9 5 569 \\r\\n\\r\\n DEREK G OSBORNE\\r... M \n", "\n", " City Chip Time Gun Time \\\n", "5 TIGARD 36:21 36:24 \n", "6 PORTLAND 36:42 36:45 \n", "7 PORTLAND 37:44 37:48 \n", "8 BEAVERTON 38:34 38:37 \n", "9 HILLSBORO 39:21 39:24 \n", "\n", " Team \n", "5 ] \n", "6 \\n\\r\\n INTEL TEAM ... \n", "7 ] \n", "8 ] \n", "9 \\n\\r\\n INTEL TEAM ... " ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df7.rename(columns={'[Place': 'Place'},inplace=True)\n", "df7.rename(columns={' Team]': 'Team'},inplace=True)\n", "df7.head()" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PlaceBibNameGenderCityChip TimeGun TimeTeam
51814\\r\\n\\r\\n JARED WILSON\\r\\n\\...MTIGARD36:2136:24
62573\\r\\n\\r\\n NATHAN A SUSTERSI...MPORTLAND36:4236:45\\n\\r\\n INTEL TEAM ...
73687\\r\\n\\r\\n FRANCISCO MAYA\\r\\...MPORTLAND37:4437:48
84623\\r\\n\\r\\n PAUL MORROW\\r\\n\\r...MBEAVERTON38:3438:37
95569\\r\\n\\r\\n DEREK G OSBORNE\\r...MHILLSBORO39:2139:24\\n\\r\\n INTEL TEAM ...
\n", "
" ], "text/plain": [ " Place Bib Name Gender \\\n", "5 1 814 \\r\\n\\r\\n JARED WILSON\\r\\n\\... M \n", "6 2 573 \\r\\n\\r\\n NATHAN A SUSTERSI... M \n", "7 3 687 \\r\\n\\r\\n FRANCISCO MAYA\\r\\... M \n", "8 4 623 \\r\\n\\r\\n PAUL MORROW\\r\\n\\r... M \n", "9 5 569 \\r\\n\\r\\n DEREK G OSBORNE\\r... M \n", "\n", " City Chip Time Gun Time \\\n", "5 TIGARD 36:21 36:24 \n", "6 PORTLAND 36:42 36:45 \n", "7 PORTLAND 37:44 37:48 \n", "8 BEAVERTON 38:34 38:37 \n", "9 HILLSBORO 39:21 39:24 \n", "\n", " Team \n", "5 \n", "6 \\n\\r\\n INTEL TEAM ... \n", "7 \n", "8 \n", "9 \\n\\r\\n INTEL TEAM ... " ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df7['Team'] = df7['Team'].str.strip(']')\n", "df7.head()" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "time_list = df7[' Chip Time'].tolist()\n", "\n", "# You can use a for loop to convert 'Chip Time' to minutes\n", "\n", "time_mins = []\n", "for i in time_list:\n", " try:\n", " h, m, s = i.split(':')\n", " math = (int(h) * 3600 + int(m) * 60 + int(s))/60\n", " except:\n", " h, m = i.split(':')\n", " math = (int(h) * 3600 + int(m) * 60) # + int(s))/60\n", " time_mins.append(math)\n", "#print(time_mins)" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PlaceBibNameGenderCityChip TimeGun TimeTeamRunner_mins
51814\\r\\n\\r\\n JARED WILSON\\r\\n\\...MTIGARD36:2136:24130860.0
62573\\r\\n\\r\\n NATHAN A SUSTERSI...MPORTLAND36:4236:45\\n\\r\\n INTEL TEAM ...132120.0
73687\\r\\n\\r\\n FRANCISCO MAYA\\r\\...MPORTLAND37:4437:48135840.0
84623\\r\\n\\r\\n PAUL MORROW\\r\\n\\r...MBEAVERTON38:3438:37138840.0
95569\\r\\n\\r\\n DEREK G OSBORNE\\r...MHILLSBORO39:2139:24\\n\\r\\n INTEL TEAM ...141660.0
\n", "
" ], "text/plain": [ " Place Bib Name Gender \\\n", "5 1 814 \\r\\n\\r\\n JARED WILSON\\r\\n\\... M \n", "6 2 573 \\r\\n\\r\\n NATHAN A SUSTERSI... M \n", "7 3 687 \\r\\n\\r\\n FRANCISCO MAYA\\r\\... M \n", "8 4 623 \\r\\n\\r\\n PAUL MORROW\\r\\n\\r... M \n", "9 5 569 \\r\\n\\r\\n DEREK G OSBORNE\\r... M \n", "\n", " City Chip Time Gun Time \\\n", "5 TIGARD 36:21 36:24 \n", "6 PORTLAND 36:42 36:45 \n", "7 PORTLAND 37:44 37:48 \n", "8 BEAVERTON 38:34 38:37 \n", "9 HILLSBORO 39:21 39:24 \n", "\n", " Team Runner_mins \n", "5 130860.0 \n", "6 \\n\\r\\n INTEL TEAM ... 132120.0 \n", "7 135840.0 \n", "8 138840.0 \n", "9 \\n\\r\\n INTEL TEAM ... 141660.0 " ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df7['Runner_mins'] = time_mins\n", "df7.head()" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Runner_mins
count577.000000
mean97617.157972
std92975.700498
min60.016667
25%68.300000
50%152580.000000
75%186540.000000
max215700.000000
\n", "
" ], "text/plain": [ " Runner_mins\n", "count 577.000000\n", "mean 97617.157972\n", "std 92975.700498\n", "min 60.016667\n", "25% 68.300000\n", "50% 152580.000000\n", "75% 186540.000000\n", "max 215700.000000" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df7.describe(include=[np.number])" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [], "source": [ "from pylab import rcParams\n", "rcParams['figure.figsize'] = 15, 5" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "([], [Text(1, 0, 'Runners')])" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "df7.boxplot(column='Runner_mins')\n", "plt.grid(True, axis='y')\n", "plt.ylabel('Chip Time')\n", "plt.xticks([1], ['Runners'])" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "x = df7['Runner_mins']\n", "ax = sns.distplot(x, hist=True, kde=True, rug=False, color='m', bins=25, hist_kws={'edgecolor':'black'})\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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Zq3N/qPjrLWvWmu7Wmu7JiUlVUTTIiIiIiIiAOzfv//AsMfhw4dTWlrK9ddfzyeffMKCBQu44ooruOeeew4cHxISwvz58/n73//OsGHDeOGFF1i+fDljx44lO9tJa958800WLFjA/PnzGTNmzIH9v1i1ahUffvghM2bMYPHixQQGBvLee+8d9+9y3D1qxpj6wKfAJdbatccdkYiIiIiIyDE4dOjj8uXLWb58OSeddBIA5eXl1KlT58DrQ4cOBaBdu3a0adPmwGuNGzcmPT2dhIQExowZw2efOb156enprFu3joSEhAOf8dNPP7FgwQK6desGOMlicnLycf8uR0zUjDHjgIFAojEmA7gfCAaw1r4M3AckAC8aYwDKrLVdjzsyERERERGR42CtpU2bNsyaNeuwr4eGhgIQEBBw4PEvz8vKypg8eTI//vgjs2bNIiIigoEDB1JUVPS7NkaNGsWjjz5aobEfTdXHkdbaOtbaYGttmrX2DWvty94kDWvtldbaOGttR++mJE1ERERERFzXokULMjMzDyRqpaWlrFix4qjfn5ubS1xcHBEREaxevZrZs2f/7pgTTzyRTz75hN27dwOQk5PDli1bjjv2CpmjJiIiIiIi4m9CQkL45JNPuPPOO+nQoQMdO3Zk5syZR/3+IUOGUFZWRqtWrbjrrrvo2bPn745p3bo1Dz/8MCeffDLt27fnpJNOYseOHccde0WX5xcREREREaF2YswxV2r8o887kvz8/N/t69ixI1OnTv3d/smTJx94PHDgQAYOHHjY1yZOPPzqYwev0TZixAhGjBhxxPj+CiVqIiIiIiJS4Y605pn8OQ19FBERERER8TNK1ERERERERPyMEjUREREREakQ1lq3Q/BLx/LfRYmaiIiIiIgct7CwMLKzs5WsHcJaS3Z2NmFhYX/pfSomIiIiIiIixy0tLY2MjAwyMzPdDsXvhIWFkZaW9pfeo0RNRERERESOW3BwMI0aNXI7jGpDQx9FRERERET8jBI1ERERERERP6NETURERERExM8oURMREREREfEzStRERERERET8jBI1ERERERERP6NETURERERExM8oURMREREREfEzStRERERERET8jBI1ERERERERP6NETURERERExM8oURMREREREfEzStRERERERET8jBI1ERERERERP6NETURERERExM8oURMR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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "f_fuko = df7.loc[df7[' Gender']==' F']['Runner_mins']\n", "m_fuko = df7.loc[df7[' Gender']==' M']['Runner_mins']\n", "sns.distplot(f_fuko, hist=True, kde=True, rug=False, hist_kws={'edgecolor':'black'}, label='Female')\n", "sns.distplot(m_fuko, hist=False, kde=True, rug=False, hist_kws={'edgecolor':'black'}, label='Male')\n", "plt.legend()" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Runner_mins \\\n", " count mean std min 25% \n", " Gender \n", " F 163.0 61844.168609 91100.389419 60.200000 66.550000 \n", " M 414.0 111701.692432 89982.758495 60.016667 69.320833 \n", "\n", " \n", " 50% 75% max \n", " Gender \n", " F 75.216667 173280.0 215700.0 \n", " M 163320.000000 188745.0 215580.0 \n" ] } ], "source": [ "g_stats = df7.groupby(\" Gender\", as_index=True).describe()\n", "print(g_stats)" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 0.98, '')" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "df7.boxplot(column='Runner_mins', by=' Gender')\n", "plt.ylabel('Chip Time')\n", "plt.suptitle(\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Now it is your turn:" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [], "source": [ "url5 = 'https://www.4icu.org/at/vienna/'\n", "url6 = 'https://www.opec.org/opec_web/en/press_room/307.htm'" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.6" } }, "nbformat": 4, "nbformat_minor": 4 }