{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "7e66c738-f269-4cc6-ab32-e91fb65b234d", "metadata": {}, "outputs": [], "source": [ "import re\n", "from openai import OpenAI\n", "import gradio as gr\n", "import requests\n", "import json\n", "from typing import List\n", "from bs4 import BeautifulSoup, Tag, NavigableString\n", "from IPython.display import Markdown, display, update_display" ] }, { "cell_type": "code", "execution_count": 2, "id": "f85f4df7-3173-4ed9-ae1b-83b02088b00f", "metadata": {}, "outputs": [], "source": [ "#\n", "# from Ed Donner's github repo for LLM Engineering course on Udemy: \n", "# https://github.com/ed-donner/llm_engineering/blob/main/week1/day5.ipynb\n", "#\n", "headers = {\n", " \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\"\n", "}\n", "\n", "class Website:\n", " \"\"\"\n", " A utility class to represent a Website that we have scraped, now with links\n", " \"\"\"\n", "\n", " def __init__(self, url):\n", " \n", " self.url = url\n", " self.title = None\n", " self.links = set()\n", " self.last_updated = '1970-01-01'\n", " \n", " response = requests.get(url, headers=headers)\n", " self.body = response.content\n", " self.soup = BeautifulSoup(self.body, 'html.parser')\n", " self.article = self.soup.find('article', class_='devsite-article')\n", " # self.title = soup.title.string if soup.title else \"No title found\"\n", " # if soup.body:\n", " # for irrelevant in soup.body([\"script\", \"style\", \"img\", \"input\"]):\n", " # irrelevant.decompose()\n", " # self.text = soup.body.get_text(separator=\"\\n\", strip=True)\n", " # else:\n", " # self.text = \"\"\n", " # links = [link.get('href') for link in soup.find_all('a')]\n", " # self.links = [link for link in links if link]\n", "\n", " def get_doc_title(self):\n", " if self.title:\n", " return self.title\n", "\n", " title = self.soup.find('h1', class_='devsite-page-title').find(string=True, recursive=False).strip()\n", " if not title:\n", " self.title = '{} | No Title'.format(self.url)\n", " else:\n", " self.title = title\n", "\n", " return self.title\n", "\n", " def get_last_updated(self):\n", " footer = self.soup.find('devsite-content-footer')\n", " footer_paras = footer.find_all('p')\n", " for fp in footer_paras:\n", " last_updated_re = r'Last updated (.*) UTC'\n", " match = re.search(last_updated_re, fp.get_text())\n", " if match:\n", " self.last_updated = match.group(1)\n", " break\n", "\n", " def get_doc_links(self):\n", " nav_items = self.soup.find_all('li', class_='devsite-nav-item')\n", " links_in_article = self.article_section.find_all('a', href=True)\n", " all_links = nav_items + links_in_article\n", " \n", " for al in all_links:\n", " link = al.find('a', href=True)\n", " if link and 'docs' in link['href']:\n", " if link['href'][0] == '/':\n", " self.links.add('https://cloud.google.com{}'.format(link['href']))\n", " else:\n", " self.links.add(link['href'])\n" ] }, { "cell_type": "code", "execution_count": 3, "id": "46dff4b3-949f-40ac-b8e3-cd89c5b20461", "metadata": {}, "outputs": [], "source": [ "exclude_tags = ['devsite-feedback', 'devsite-actions', 'devsite-toc', 'aside', 'devsite-page-title-meta', 'devsite-thumb-rating']" ] }, { "cell_type": "code", "execution_count": 4, "id": "5c6233b9-498b-44e4-9a87-e58aaa281ba9", "metadata": {}, "outputs": [], "source": [ "# eventarc = Website('https://cloud.google.com/eventarc/docs')\n", "eventarc = Website('https://cloud.google.com/compute/docs/overview')" ] }, { "cell_type": "code", "execution_count": 5, "id": "afa176e2-4024-493a-be97-f2526cca92cd", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Compute Engine overview'" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eventarc.get_doc_title()" ] }, { "cell_type": "code", "execution_count": 6, "id": "7dcaa961-55f9-4778-9d55-96e24b6e8c7e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Compute Engine overview'" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eventarc.title" ] }, { "cell_type": "code", "execution_count": 7, "id": "030abb06-d590-43da-8333-184520f000b0", "metadata": {}, "outputs": [], "source": [ "soup = eventarc.soup" ] }, { "cell_type": "code", "execution_count": 8, "id": "7d0e2f63-2d88-4d86-86c0-6d0cd1a463e4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Compute Engine overview\n" ] } ], "source": [ "print(soup.find('h1', class_='devsite-page-title').find(string=True, recursive=False).strip())" ] }, { "cell_type": "code", "execution_count": 9, "id": "0c908d8b-0cdb-4617-ae9a-d411cca8b7f2", "metadata": {}, "outputs": [], "source": [ "footer = soup.find('devsite-content-footer')" ] }, { "cell_type": "code", "execution_count": 10, "id": "e675fde6-664c-428c-98cc-c0d1ce4b82f1", "metadata": {}, "outputs": [], "source": [ "footer_paras = footer.find_all('p')" ] }, { "cell_type": "code", "execution_count": 11, "id": "a841163b-84f2-4068-981e-4a99b5e1fcc5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "None\n", "Nope\n", "<re.Match object; span=(0, 27), match='Last updated 2025-05-06 UTC'>\n", "2025-05-06\n" ] } ], "source": [ "for fp in footer_paras:\n", " last_updated_re = r'Last updated (.*) UTC'\n", " match = re.search(last_updated_re, fp.get_text())\n", " print(match)\n", " if match:\n", " print(match.group(1))\n", " else:\n", " print('Nope')" ] }, { "cell_type": "code", "execution_count": 12, "id": "436065d7-d3fe-412a-b0b6-a774044290b3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'2025-05-06'" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eventarc.get_last_updated()\n", "eventarc.last_updated" ] }, { "cell_type": "code", "execution_count": 13, "id": "bb6ec155-ed4d-451a-9d0d-885f959ebd85", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'https://cloud.google.com/docs/ai-ml'" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nav_items = soup.find_all('li', class_='devsite-nav-item')\n", "nav_items[0].find('a', href=True)['href']" ] }, { "cell_type": "code", "execution_count": 14, "id": "0a740921-505c-4e4a-987f-fa8947a27ebd", "metadata": {}, "outputs": [], "source": [ "links_on_page = set()\n", "for ni in nav_items:\n", " link = ni.find('a', href=True)\n", " if link and 'docs' in link['href']:\n", " if link['href'][0] == '/' and '#' not in link['href']:\n", " links_on_page.add('https://cloud.google.com{}'.format(link['href']))\n", " else:\n", " links_on_page.add(link['href'])" ] }, { "cell_type": "code", "execution_count": 15, "id": "f9474a3e-579e-4923-b1e6-22b5c782cd5f", "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "{'https://cloud.google.com/build/docs/deploying-builds/deploy-compute-engine',\n", " 'https://cloud.google.com/compute/docs/about-confidential-vm',\n", " 'https://cloud.google.com/compute/docs/about-shielded-vm',\n", " 'https://cloud.google.com/compute/docs/accelerator-optimized-machines',\n", " 'https://cloud.google.com/compute/docs/access',\n", " 'https://cloud.google.com/compute/docs/access/app-authentication-methods',\n", " 'https://cloud.google.com/compute/docs/access/authenticate-workloads',\n", " 'https://cloud.google.com/compute/docs/access/authenticate-workloads-over-mtls',\n", " 'https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances',\n", " 'https://cloud.google.com/compute/docs/access/custom-constraints',\n", " 'https://cloud.google.com/compute/docs/access/iam',\n", " 'https://cloud.google.com/compute/docs/access/managing-access-to-resources',\n", " 'https://cloud.google.com/compute/docs/access/service-accounts',\n", " 'https://cloud.google.com/compute/docs/apis',\n", " 'https://cloud.google.com/compute/docs/autoscaler',\n", " 'https://cloud.google.com/compute/docs/autoscaler/managing-autoscalers',\n", " 'https://cloud.google.com/compute/docs/autoscaler/multiple-signals',\n", " 'https://cloud.google.com/compute/docs/autoscaler/predictive-autoscaling',\n", " 'https://cloud.google.com/compute/docs/autoscaler/scaling-cloud-monitoring-metrics',\n", " 'https://cloud.google.com/compute/docs/autoscaler/scaling-cpu',\n", " 'https://cloud.google.com/compute/docs/autoscaler/scaling-load-balancing',\n", " 'https://cloud.google.com/compute/docs/autoscaler/scaling-schedules',\n", " 'https://cloud.google.com/compute/docs/autoscaler/understanding-autoscaler-decisions',\n", " 'https://cloud.google.com/compute/docs/autoscaler/viewing-autoscaler-logs',\n", " 'https://cloud.google.com/compute/docs/choose-compute-deployment-option',\n", " 'https://cloud.google.com/compute/docs/committed-use-discounts/extend-commitment-term',\n", " 'https://cloud.google.com/compute/docs/compute-optimized-machines',\n", " 'https://cloud.google.com/compute/docs/connect/add-ssh-keys',\n", " 'https://cloud.google.com/compute/docs/connect/create-ssh-keys',\n", " 'https://cloud.google.com/compute/docs/connect/restrict-ssh-keys',\n", " 'https://cloud.google.com/compute/docs/connect/root-ssh',\n", " 'https://cloud.google.com/compute/docs/connect/set-up-service-account-ssh',\n", " 'https://cloud.google.com/compute/docs/connect/ssh-best-practices',\n", " 'https://cloud.google.com/compute/docs/connect/ssh-best-practices/auditing',\n", " 'https://cloud.google.com/compute/docs/connect/ssh-best-practices/credentials',\n", " 'https://cloud.google.com/compute/docs/connect/ssh-best-practices/login-access',\n", " 'https://cloud.google.com/compute/docs/connect/ssh-best-practices/network-access',\n", " 'https://cloud.google.com/compute/docs/connect/ssh-internal-ip',\n", " 'https://cloud.google.com/compute/docs/connect/ssh-using-bastion-host',\n", " 'https://cloud.google.com/compute/docs/connect/ssh-using-iap',\n", " 'https://cloud.google.com/compute/docs/connect/ssh-using-vpn',\n", " 'https://cloud.google.com/compute/docs/connect/standard-ssh',\n", " 'https://cloud.google.com/compute/docs/connect/windows-ssh',\n", " 'https://cloud.google.com/compute/docs/containers',\n", " 'https://cloud.google.com/compute/docs/containers/configuring-options-to-run-containers',\n", " 'https://cloud.google.com/compute/docs/containers/deploying-containers',\n", " 'https://cloud.google.com/compute/docs/containers/openshift-ha',\n", " 'https://cloud.google.com/compute/docs/coremark-scores-of-vm-instances',\n", " 'https://cloud.google.com/compute/docs/cpu-platforms',\n", " 'https://cloud.google.com/compute/docs/create-linux-vm-instance',\n", " 'https://cloud.google.com/compute/docs/create-windows-server-vm-instance',\n", " 'https://cloud.google.com/compute/docs/disks',\n", " 'https://cloud.google.com/compute/docs/disks/about-regional-persistent-disk',\n", " 'https://cloud.google.com/compute/docs/disks/about-snapshot-schedules',\n", " 'https://cloud.google.com/compute/docs/disks/add-hyperdisk',\n", " 'https://cloud.google.com/compute/docs/disks/add-local-ssd',\n", " 'https://cloud.google.com/compute/docs/disks/add-persistent-disk',\n", " 'https://cloud.google.com/compute/docs/disks/analyze-iops-hyperdisk',\n", " 'https://cloud.google.com/compute/docs/disks/async-pd/about',\n", " 'https://cloud.google.com/compute/docs/disks/async-pd/configure',\n", " 'https://cloud.google.com/compute/docs/disks/async-pd/failover-failback',\n", " 'https://cloud.google.com/compute/docs/disks/async-pd/manage-async-disks',\n", " 'https://cloud.google.com/compute/docs/disks/async-pd/manage-consistency-groups',\n", " 'https://cloud.google.com/compute/docs/disks/async-pd/manage-replication',\n", " 'https://cloud.google.com/compute/docs/disks/async-pd/performance',\n", " 'https://cloud.google.com/compute/docs/disks/attach-disks',\n", " 'https://cloud.google.com/compute/docs/disks/benchmark-hyperdisk-performance',\n", " 'https://cloud.google.com/compute/docs/disks/benchmarking-local-ssd-performance',\n", " 'https://cloud.google.com/compute/docs/disks/benchmarking-pd-performance-linux',\n", " 'https://cloud.google.com/compute/docs/disks/benchmarking-pd-performance-windows',\n", " 'https://cloud.google.com/compute/docs/disks/clone-duplicate-disks',\n", " 'https://cloud.google.com/compute/docs/disks/convert-instant-snapshot',\n", " 'https://cloud.google.com/compute/docs/disks/create-alert-snapshot-schedule',\n", " 'https://cloud.google.com/compute/docs/disks/create-instant-snapshots',\n", " 'https://cloud.google.com/compute/docs/disks/create-root-persistent-disks',\n", " 'https://cloud.google.com/compute/docs/disks/create-snapshots',\n", " 'https://cloud.google.com/compute/docs/disks/create-storage-pools',\n", " 'https://cloud.google.com/compute/docs/disks/creating-linux-application-consistent-pd-snapshots',\n", " 'https://cloud.google.com/compute/docs/disks/customer-managed-encryption',\n", " 'https://cloud.google.com/compute/docs/disks/customer-supplied-encryption',\n", " 'https://cloud.google.com/compute/docs/disks/data-protection',\n", " 'https://cloud.google.com/compute/docs/disks/default-backup',\n", " 'https://cloud.google.com/compute/docs/disks/design-considerations-for-resilient-workloads-with-regional-persistent-disks',\n", " 'https://cloud.google.com/compute/docs/disks/detach-reattach-boot-disk',\n", " 'https://cloud.google.com/compute/docs/disks/disk-encryption',\n", " 'https://cloud.google.com/compute/docs/disks/disk-health',\n", " 'https://cloud.google.com/compute/docs/disks/disk-symlinks',\n", " 'https://cloud.google.com/compute/docs/disks/extreme-persistent-disk',\n", " 'https://cloud.google.com/compute/docs/disks/format-mount-disk-linux',\n", " 'https://cloud.google.com/compute/docs/disks/format-mount-disk-windows',\n", " 'https://cloud.google.com/compute/docs/disks/hd-types/hyperdisk-balanced',\n", " 'https://cloud.google.com/compute/docs/disks/hd-types/hyperdisk-balanced-ha',\n", " 'https://cloud.google.com/compute/docs/disks/hd-types/hyperdisk-extreme',\n", " 'https://cloud.google.com/compute/docs/disks/hd-types/hyperdisk-ml',\n", " 'https://cloud.google.com/compute/docs/disks/hd-types/hyperdisk-throughput',\n", " 'https://cloud.google.com/compute/docs/disks/high-availability-regional-persistent-disk',\n", " 'https://cloud.google.com/compute/docs/disks/hyperdisk-perf-limits',\n", " 'https://cloud.google.com/compute/docs/disks/hyperdisk-performance',\n", " 'https://cloud.google.com/compute/docs/disks/hyperdisks',\n", " 'https://cloud.google.com/compute/docs/disks/instant-snapshots',\n", " 'https://cloud.google.com/compute/docs/disks/local-ssd',\n", " 'https://cloud.google.com/compute/docs/disks/manage-snapshot-schedules',\n", " 'https://cloud.google.com/compute/docs/disks/manage-snapshots',\n", " 'https://cloud.google.com/compute/docs/disks/manage-storage-pools',\n", " 'https://cloud.google.com/compute/docs/disks/migrate-to-hyperdisk',\n", " 'https://cloud.google.com/compute/docs/disks/modify-hyperdisks',\n", " 'https://cloud.google.com/compute/docs/disks/modify-persistent-disk',\n", " 'https://cloud.google.com/compute/docs/disks/monitor-disks',\n", " 'https://cloud.google.com/compute/docs/disks/monitor-pool-performance',\n", " 'https://cloud.google.com/compute/docs/disks/monitor-regional-persistent-disk-replica-state',\n", " 'https://cloud.google.com/compute/docs/disks/mount-ram-disks',\n", " 'https://cloud.google.com/compute/docs/disks/optimize-hyperdisk',\n", " 'https://cloud.google.com/compute/docs/disks/optimizing-local-ssd-performance',\n", " 'https://cloud.google.com/compute/docs/disks/optimizing-pd-performance',\n", " 'https://cloud.google.com/compute/docs/disks/performance',\n", " 'https://cloud.google.com/compute/docs/disks/persistent-disks',\n", " 'https://cloud.google.com/compute/docs/disks/recover-vm',\n", " 'https://cloud.google.com/compute/docs/disks/regional-persistent-disk',\n", " 'https://cloud.google.com/compute/docs/disks/repd-failover',\n", " 'https://cloud.google.com/compute/docs/disks/resize-persistent-disk',\n", " 'https://cloud.google.com/compute/docs/disks/restore-instant-snapshot',\n", " 'https://cloud.google.com/compute/docs/disks/restore-snapshot',\n", " 'https://cloud.google.com/compute/docs/disks/review-disk-metrics',\n", " 'https://cloud.google.com/compute/docs/disks/review-storage-pool-metrics',\n", " 'https://cloud.google.com/compute/docs/disks/scheduled-snapshots',\n", " 'https://cloud.google.com/compute/docs/disks/set-persistent-device-name-in-linux-vm',\n", " 'https://cloud.google.com/compute/docs/disks/set-snapshot-scope',\n", " 'https://cloud.google.com/compute/docs/disks/sharing-disks-between-vms',\n", " 'https://cloud.google.com/compute/docs/disks/snapshot-best-practices',\n", " 'https://cloud.google.com/compute/docs/disks/snapshot-settings',\n", " 'https://cloud.google.com/compute/docs/disks/snapshots',\n", " 'https://cloud.google.com/compute/docs/disks/storage-pools',\n", " 'https://cloud.google.com/compute/docs/disks/use-storage-pool-capacity',\n", " 'https://cloud.google.com/compute/docs/dynamic-resource-management',\n", " 'https://cloud.google.com/compute/docs/enable-pmu-in-vms',\n", " 'https://cloud.google.com/compute/docs/general-purpose-machines',\n", " 'https://cloud.google.com/compute/docs/gpus',\n", " 'https://cloud.google.com/compute/docs/gpus/about-gpus',\n", " 'https://cloud.google.com/compute/docs/gpus/add-remove-gpus',\n", " 'https://cloud.google.com/compute/docs/gpus/create-gpu-vm-a3u-a4',\n", " 'https://cloud.google.com/compute/docs/gpus/create-gpu-vm-accelerator-optimized',\n", " 'https://cloud.google.com/compute/docs/gpus/create-gpu-vm-bulk',\n", " 'https://cloud.google.com/compute/docs/gpus/create-gpu-vm-general-purpose',\n", " 'https://cloud.google.com/compute/docs/gpus/create-vm-with-gpus',\n", " 'https://cloud.google.com/compute/docs/gpus/gpu-host-maintenance',\n", " 'https://cloud.google.com/compute/docs/gpus/gpu-network-bandwidth',\n", " 'https://cloud.google.com/compute/docs/gpus/gpu-regions-zones',\n", " 'https://cloud.google.com/compute/docs/gpus/gpudirect',\n", " 'https://cloud.google.com/compute/docs/gpus/grid-drivers-table',\n", " 'https://cloud.google.com/compute/docs/gpus/install-drivers-gpu',\n", " 'https://cloud.google.com/compute/docs/gpus/install-grid-drivers',\n", " 'https://cloud.google.com/compute/docs/gpus/monitor-gpus',\n", " 'https://cloud.google.com/compute/docs/gpus/monitor-gpus-windows',\n", " 'https://cloud.google.com/compute/docs/gpus/optimize-gpus',\n", " 'https://cloud.google.com/compute/docs/gpus/overview',\n", " 'https://cloud.google.com/compute/docs/images',\n", " 'https://cloud.google.com/compute/docs/images/building-custom-os',\n", " 'https://cloud.google.com/compute/docs/images/create-custom',\n", " 'https://cloud.google.com/compute/docs/images/creating-an-image-from-an-iso-file',\n", " 'https://cloud.google.com/compute/docs/images/creating-custom-windows-byol-images',\n", " 'https://cloud.google.com/compute/docs/images/delete-custom',\n", " 'https://cloud.google.com/compute/docs/images/deprecate-custom',\n", " 'https://cloud.google.com/compute/docs/images/export-image',\n", " 'https://cloud.google.com/compute/docs/images/guest-environment',\n", " 'https://cloud.google.com/compute/docs/images/image-families-best-practices',\n", " 'https://cloud.google.com/compute/docs/images/image-management-best-practices',\n", " 'https://cloud.google.com/compute/docs/images/install-guest-environment',\n", " 'https://cloud.google.com/compute/docs/images/managing-access-custom-images',\n", " 'https://cloud.google.com/compute/docs/images/os-details',\n", " 'https://cloud.google.com/compute/docs/images/os-image-lifecycle',\n", " 'https://cloud.google.com/compute/docs/images/premium/access-rhel-knowledgebase',\n", " 'https://cloud.google.com/compute/docs/images/premium/rhel-faq',\n", " 'https://cloud.google.com/compute/docs/images/premium/rhel/appending-els-licenses',\n", " 'https://cloud.google.com/compute/docs/images/premium/sles-faq',\n", " 'https://cloud.google.com/compute/docs/images/premium/ubuntu-pro-faq',\n", " 'https://cloud.google.com/compute/docs/images/premium/ubuntu-pro/upgrade-from-ubuntu',\n", " 'https://cloud.google.com/compute/docs/images/restricting-image-access',\n", " 'https://cloud.google.com/compute/docs/images/set-version-custom',\n", " 'https://cloud.google.com/compute/docs/images/support-maintenance-policy',\n", " 'https://cloud.google.com/compute/docs/import',\n", " 'https://cloud.google.com/compute/docs/import/configuring-imported-images',\n", " 'https://cloud.google.com/compute/docs/import/import-existing-image',\n", " 'https://cloud.google.com/compute/docs/import/import-ovf-files',\n", " 'https://cloud.google.com/compute/docs/import/importing-virtual-disks',\n", " 'https://cloud.google.com/compute/docs/import/migrate-to-new-vm',\n", " 'https://cloud.google.com/compute/docs/import/requirements-export-import-images',\n", " 'https://cloud.google.com/compute/docs/instance-groups',\n", " 'https://cloud.google.com/compute/docs/instance-groups/about-instance-flexibility',\n", " 'https://cloud.google.com/compute/docs/instance-groups/about-repair',\n", " 'https://cloud.google.com/compute/docs/instance-groups/about-resize-requests-mig',\n", " 'https://cloud.google.com/compute/docs/instance-groups/accelerate-mig-scale-out-with-standby-pools',\n", " 'https://cloud.google.com/compute/docs/instance-groups/add-remove-vms-in-mig',\n", " 'https://cloud.google.com/compute/docs/instance-groups/adding-an-instance-group-to-a-load-balancer',\n", " 'https://cloud.google.com/compute/docs/instance-groups/apply-machine-type-recommendations-managed-instance-groups',\n", " 'https://cloud.google.com/compute/docs/instance-groups/applying-viewing-removing-stateful-config-in-migs',\n", " 'https://cloud.google.com/compute/docs/instance-groups/autohealing-instances-in-migs',\n", " 'https://cloud.google.com/compute/docs/instance-groups/change-or-remove-instance-flexibility-configuration',\n", " 'https://cloud.google.com/compute/docs/instance-groups/configure-instance-flexibility',\n", " 'https://cloud.google.com/compute/docs/instance-groups/configuring-stateful-disks-in-migs',\n", " 'https://cloud.google.com/compute/docs/instance-groups/configuring-stateful-ip-addresses-in-migs',\n", " 'https://cloud.google.com/compute/docs/instance-groups/configuring-stateful-metadata-in-migs',\n", " 'https://cloud.google.com/compute/docs/instance-groups/configuring-stateful-migs',\n", " 'https://cloud.google.com/compute/docs/instance-groups/create-mig-from-vm',\n", " 'https://cloud.google.com/compute/docs/instance-groups/create-mig-with-basic-autoscaling',\n", " 'https://cloud.google.com/compute/docs/instance-groups/create-mig-with-basic-stateful-disks',\n", " 'https://cloud.google.com/compute/docs/instance-groups/create-mig-with-gpu-vms',\n", " 'https://cloud.google.com/compute/docs/instance-groups/create-mig-with-multiple-machine-types',\n", " 'https://cloud.google.com/compute/docs/instance-groups/create-mig-with-preemptible-vms',\n", " 'https://cloud.google.com/compute/docs/instance-groups/create-resize-requests-mig',\n", " 'https://cloud.google.com/compute/docs/instance-groups/create-zonal-mig',\n", " 'https://cloud.google.com/compute/docs/instance-groups/creating-groups-of-managed-instances',\n", " 'https://cloud.google.com/compute/docs/instance-groups/creating-groups-of-unmanaged-instances',\n", " 'https://cloud.google.com/compute/docs/instance-groups/delete-mig',\n", " 'https://cloud.google.com/compute/docs/instance-groups/disabling-and-enabling-health-state-change-logs',\n", " 'https://cloud.google.com/compute/docs/instance-groups/distributing-instances-with-regional-instance-groups',\n", " 'https://cloud.google.com/compute/docs/instance-groups/getting-info-about-migs',\n", " 'https://cloud.google.com/compute/docs/instance-groups/how-stateful-migs-work',\n", " 'https://cloud.google.com/compute/docs/instance-groups/limit-vm-runtime-in-migs',\n", " 'https://cloud.google.com/compute/docs/instance-groups/manage-resize-requests-mig',\n", " 'https://cloud.google.com/compute/docs/instance-groups/manually-suspend-or-stop-vms-in-mig',\n", " 'https://cloud.google.com/compute/docs/instance-groups/monitoring-managed-instance-health-state-changes',\n", " 'https://cloud.google.com/compute/docs/instance-groups/preserved-state',\n", " 'https://cloud.google.com/compute/docs/instance-groups/regional-mig-distribution-shape',\n", " 'https://cloud.google.com/compute/docs/instance-groups/regional-mig-enable-disable-proactive-redistribution',\n", " 'https://cloud.google.com/compute/docs/instance-groups/regional-mig-rebalance-manually',\n", " 'https://cloud.google.com/compute/docs/instance-groups/regional-mig-set-target-distribution-shape',\n", " 'https://cloud.google.com/compute/docs/instance-groups/regional-mig-simulate-zonal-outage',\n", " 'https://cloud.google.com/compute/docs/instance-groups/regional-migs',\n", " 'https://cloud.google.com/compute/docs/instance-groups/rolling-out-updates-to-managed-instance-groups',\n", " 'https://cloud.google.com/compute/docs/instance-groups/set-mig-aic',\n", " 'https://cloud.google.com/compute/docs/instance-groups/stateful-migs',\n", " 'https://cloud.google.com/compute/docs/instance-groups/suspended-and-stopped-vms-in-mig',\n", " 'https://cloud.google.com/compute/docs/instance-groups/turn-off-vm-repairs-in-mig',\n", " 'https://cloud.google.com/compute/docs/instance-groups/update-on-repair',\n", " 'https://cloud.google.com/compute/docs/instance-groups/updating-migs',\n", " 'https://cloud.google.com/compute/docs/instance-groups/updating-selected-instances-in-a-mig',\n", " 'https://cloud.google.com/compute/docs/instance-groups/upgrading-images-in-migs',\n", " 'https://cloud.google.com/compute/docs/instance-groups/view-and-understand-mig-insights',\n", " 'https://cloud.google.com/compute/docs/instance-groups/view-instance-flexibility-configuration',\n", " 'https://cloud.google.com/compute/docs/instance-groups/working-with-managed-instances',\n", " 'https://cloud.google.com/compute/docs/instance-templates',\n", " 'https://cloud.google.com/compute/docs/instance-templates/create-instance-templates',\n", " 'https://cloud.google.com/compute/docs/instance-templates/deterministic-instance-templates',\n", " 'https://cloud.google.com/compute/docs/instance-templates/get-list-delete-instance-templates',\n", " 'https://cloud.google.com/compute/docs/instances',\n", " 'https://cloud.google.com/compute/docs/instances/about-vm-tenancy',\n", " 'https://cloud.google.com/compute/docs/instances/access-overview',\n", " 'https://cloud.google.com/compute/docs/instances/agent-for-compute-workloads',\n", " 'https://cloud.google.com/compute/docs/instances/apply-machine-type-recommendations-for-instances',\n", " 'https://cloud.google.com/compute/docs/instances/arm-on-compute',\n", " 'https://cloud.google.com/compute/docs/instances/artifact-registry-os-packages',\n", " 'https://cloud.google.com/compute/docs/instances/bare-metal-instances',\n", " 'https://cloud.google.com/compute/docs/instances/change-service-account',\n", " 'https://cloud.google.com/compute/docs/instances/changing-machine-type-of-stopped-instance',\n", " 'https://cloud.google.com/compute/docs/instances/choose-reservation-type',\n", " 'https://cloud.google.com/compute/docs/instances/committed-use-discounts-overview',\n", " 'https://cloud.google.com/compute/docs/instances/configure-idle-reservation-recommendations',\n", " 'https://cloud.google.com/compute/docs/instances/configure-machine-type-recommendations',\n", " 'https://cloud.google.com/compute/docs/instances/configure-ntp',\n", " 'https://cloud.google.com/compute/docs/instances/configure-underutilized-reservation-recommendations',\n", " 'https://cloud.google.com/compute/docs/instances/configuring-idle-vm-recommendations',\n", " 'https://cloud.google.com/compute/docs/instances/connecting-to-sac',\n", " 'https://cloud.google.com/compute/docs/instances/connecting-to-windows',\n", " 'https://cloud.google.com/compute/docs/instances/copy-vm-between-projects',\n", " 'https://cloud.google.com/compute/docs/instances/create-future-reservations-calendar-mode',\n", " 'https://cloud.google.com/compute/docs/instances/create-hpc-vm',\n", " 'https://cloud.google.com/compute/docs/instances/create-instance-with-gcbdr-backup-plan',\n", " 'https://cloud.google.com/compute/docs/instances/create-ipv6-instance',\n", " 'https://cloud.google.com/compute/docs/instances/create-ptr-record',\n", " 'https://cloud.google.com/compute/docs/instances/create-rhel-byos-vm',\n", " 'https://cloud.google.com/compute/docs/instances/create-shared-future-reservations',\n", " 'https://cloud.google.com/compute/docs/instances/create-single-project-future-reservations',\n", " 'https://cloud.google.com/compute/docs/instances/create-start-instance',\n", " 'https://cloud.google.com/compute/docs/instances/create-use-preemptible',\n", " 'https://cloud.google.com/compute/docs/instances/create-use-spot',\n", " 'https://cloud.google.com/compute/docs/instances/create-vm-from-custom-image',\n", " 'https://cloud.google.com/compute/docs/instances/create-vm-from-instance-template',\n", " 'https://cloud.google.com/compute/docs/instances/create-vm-from-public-image',\n", " 'https://cloud.google.com/compute/docs/instances/create-vm-from-shared-image',\n", " 'https://cloud.google.com/compute/docs/instances/create-vm-from-similar-instance',\n", " 'https://cloud.google.com/compute/docs/instances/create-vm-ops-agent-monitoring-logging',\n", " 'https://cloud.google.com/compute/docs/instances/create-vm-specific-subnet',\n", " 'https://cloud.google.com/compute/docs/instances/create-vm-with-additional-non-boot-disks',\n", " 'https://cloud.google.com/compute/docs/instances/create-workload-optimized-instance',\n", " 'https://cloud.google.com/compute/docs/instances/creating-instance-with-custom-machine-type',\n", " 'https://cloud.google.com/compute/docs/instances/custom-hostname-vm',\n", " 'https://cloud.google.com/compute/docs/instances/customize-visible-cores',\n", " 'https://cloud.google.com/compute/docs/instances/delete-future-reservations',\n", " 'https://cloud.google.com/compute/docs/instances/deleting-instance',\n", " 'https://cloud.google.com/compute/docs/instances/detect-compute-engine',\n", " 'https://cloud.google.com/compute/docs/instances/disable-graceful-shutdown',\n", " 'https://cloud.google.com/compute/docs/instances/enable-graceful-shutdown',\n", " 'https://cloud.google.com/compute/docs/instances/enable-instance-virtual-display',\n", " 'https://cloud.google.com/compute/docs/instances/enabling-virtio-rng',\n", " 'https://cloud.google.com/compute/docs/instances/future-reservations-calendar-mode-overview',\n", " 'https://cloud.google.com/compute/docs/instances/future-reservations-overview',\n", " 'https://cloud.google.com/compute/docs/instances/get-list',\n", " 'https://cloud.google.com/compute/docs/instances/get-uuid',\n", " 'https://cloud.google.com/compute/docs/instances/graceful-shutdown-overview',\n", " 'https://cloud.google.com/compute/docs/instances/host-maintenance-overview',\n", " 'https://cloud.google.com/compute/docs/instances/idle-vm-recommendations-overview',\n", " 'https://cloud.google.com/compute/docs/instances/instance-creation-overview',\n", " 'https://cloud.google.com/compute/docs/instances/instance-lifecycle',\n", " 'https://cloud.google.com/compute/docs/instances/limit-vm-runtime',\n", " 'https://cloud.google.com/compute/docs/instances/live-migration-process',\n", " 'https://cloud.google.com/compute/docs/instances/manage-placement-policies',\n", " 'https://cloud.google.com/compute/docs/instances/merge-and-split-commitments',\n", " 'https://cloud.google.com/compute/docs/instances/migrating-interfaces-between-networks',\n", " 'https://cloud.google.com/compute/docs/instances/modify-future-reservations',\n", " 'https://cloud.google.com/compute/docs/instances/monitor-plan-host-maintenance-event',\n", " 'https://cloud.google.com/compute/docs/instances/moving-instance-across-zones',\n", " 'https://cloud.google.com/compute/docs/instances/multiple/about-bulk-creation',\n", " 'https://cloud.google.com/compute/docs/instances/multiple/create-in-bulk',\n", " 'https://cloud.google.com/compute/docs/instances/nested-virtualization/creating-nested-vms',\n", " 'https://cloud.google.com/compute/docs/instances/nested-virtualization/enabling',\n", " 'https://cloud.google.com/compute/docs/instances/nested-virtualization/managing-constraint',\n", " 'https://cloud.google.com/compute/docs/instances/nested-virtualization/overview',\n", " 'https://cloud.google.com/compute/docs/instances/observe-monitor-vms',\n", " 'https://cloud.google.com/compute/docs/instances/permissions-tutorial',\n", " 'https://cloud.google.com/compute/docs/instances/placement-policies-overview',\n", " 'https://cloud.google.com/compute/docs/instances/preemptible',\n", " 'https://cloud.google.com/compute/docs/instances/preventing-accidental-vm-deletion',\n", " 'https://cloud.google.com/compute/docs/instances/protecting-resources-vpc-service-controls',\n", " 'https://cloud.google.com/compute/docs/instances/provisioning-models',\n", " 'https://cloud.google.com/compute/docs/instances/rename-instance',\n", " 'https://cloud.google.com/compute/docs/instances/renew-commitments-automatically',\n", " 'https://cloud.google.com/compute/docs/instances/reservation-recommendations-overview',\n", " 'https://cloud.google.com/compute/docs/instances/reservations-consume',\n", " 'https://cloud.google.com/compute/docs/instances/reservations-delete',\n", " 'https://cloud.google.com/compute/docs/instances/reservations-modify',\n", " 'https://cloud.google.com/compute/docs/instances/reservations-monitor',\n", " 'https://cloud.google.com/compute/docs/instances/reservations-prevent-consumption',\n", " 'https://cloud.google.com/compute/docs/instances/reservations-shared',\n", " 'https://cloud.google.com/compute/docs/instances/reservations-single-project',\n", " 'https://cloud.google.com/compute/docs/instances/reservations-view',\n", " 'https://cloud.google.com/compute/docs/instances/reservations-with-commitments',\n", " 'https://cloud.google.com/compute/docs/instances/reset-instance',\n", " 'https://cloud.google.com/compute/docs/instances/schedule-instance-start-stop',\n", " 'https://cloud.google.com/compute/docs/instances/set-threads-per-core',\n", " 'https://cloud.google.com/compute/docs/instances/setting-vm-host-options',\n", " 'https://cloud.google.com/compute/docs/instances/signing-up-committed-use-discounts',\n", " 'https://cloud.google.com/compute/docs/instances/simulating-host-maintenance',\n", " 'https://cloud.google.com/compute/docs/instances/specify-min-cpu-platform',\n", " 'https://cloud.google.com/compute/docs/instances/spot',\n", " 'https://cloud.google.com/compute/docs/instances/sql-server/adding-sql-server-license',\n", " 'https://cloud.google.com/compute/docs/instances/sql-server/adding-sql-server-license-to-linux',\n", " 'https://cloud.google.com/compute/docs/instances/sql-server/best-practices',\n", " 'https://cloud.google.com/compute/docs/instances/sql-server/cloning-a-microsoft-sql-server-database-on-compute-engine',\n", " 'https://cloud.google.com/compute/docs/instances/sql-server/cloning-a-mysql-database-on-compute-engine',\n", " 'https://cloud.google.com/compute/docs/instances/sql-server/configure-availability',\n", " 'https://cloud.google.com/compute/docs/instances/sql-server/configure-availability-dnn',\n", " 'https://cloud.google.com/compute/docs/instances/sql-server/configure-failover-cluster-instance',\n", " 'https://cloud.google.com/compute/docs/instances/sql-server/configure-failover-cluster-instance-with-multi-writer',\n", " 'https://cloud.google.com/compute/docs/instances/sql-server/creating-sql-server-instances',\n", " 'https://cloud.google.com/compute/docs/instances/sql-server/deploying-highly-available-mysql-cluster-with-drbd-on-compute-engine',\n", " 'https://cloud.google.com/compute/docs/instances/sql-server/deploying-microsoft-sql-server-multi-regional-disaster-recovery',\n", " 'https://cloud.google.com/compute/docs/instances/sql-server/disaster-recovery-for-microsoft-sql-server',\n", " 'https://cloud.google.com/compute/docs/instances/sql-server/dr-for-microsoft-sql-server-with-async-pd',\n", " 'https://cloud.google.com/compute/docs/instances/sql-server/migrate-sql-server-database-from-windows-to-linux',\n", " 'https://cloud.google.com/compute/docs/instances/sql-server/mysql-remote-access',\n", " 'https://cloud.google.com/compute/docs/instances/sql-server/setup-mysql',\n", " 'https://cloud.google.com/compute/docs/instances/ssh',\n", " 'https://cloud.google.com/compute/docs/instances/startup-scripts',\n", " 'https://cloud.google.com/compute/docs/instances/startup-scripts/linux',\n", " 'https://cloud.google.com/compute/docs/instances/startup-scripts/windows',\n", " 'https://cloud.google.com/compute/docs/instances/stop-start-instance',\n", " 'https://cloud.google.com/compute/docs/instances/suspend-resume-instance',\n", " 'https://cloud.google.com/compute/docs/instances/suspend-stop-reset-instances-overview',\n", " 'https://cloud.google.com/compute/docs/instances/transfer-files',\n", " 'https://cloud.google.com/compute/docs/instances/transfer-files-windows',\n", " 'https://cloud.google.com/compute/docs/instances/trigger-host-maintenance-event',\n", " 'https://cloud.google.com/compute/docs/instances/update-instance-properties',\n", " 'https://cloud.google.com/compute/docs/instances/upgrade-commitment-term',\n", " 'https://cloud.google.com/compute/docs/instances/use-compact-placement-policies',\n", " 'https://cloud.google.com/compute/docs/instances/use-spread-placement-policies',\n", " 'https://cloud.google.com/compute/docs/instances/verifying-instance-identity',\n", " 'https://cloud.google.com/compute/docs/instances/view-and-apply-idle-reservation-recommendations',\n", " 'https://cloud.google.com/compute/docs/instances/view-and-apply-underutilized-reservation-recommendations',\n", " 'https://cloud.google.com/compute/docs/instances/view-and-understand-vm-insights',\n", " 'https://cloud.google.com/compute/docs/instances/view-graceful-shutdown',\n", " 'https://cloud.google.com/compute/docs/instances/view-network-properties',\n", " 'https://cloud.google.com/compute/docs/instances/view-placement-policies',\n", " 'https://cloud.google.com/compute/docs/instances/view-references-between-resources',\n", " 'https://cloud.google.com/compute/docs/instances/view-visible-cores',\n", " 'https://cloud.google.com/compute/docs/instances/view-vm-details',\n", " 'https://cloud.google.com/compute/docs/instances/view-vm-image',\n", " 'https://cloud.google.com/compute/docs/instances/viewing-and-applying-idle-vm-recommendations',\n", " 'https://cloud.google.com/compute/docs/instances/viewing-compute-operations',\n", " 'https://cloud.google.com/compute/docs/instances/windows',\n", " 'https://cloud.google.com/compute/docs/instances/windows/automate-pw-generation',\n", " 'https://cloud.google.com/compute/docs/instances/windows/best-practices',\n", " 'https://cloud.google.com/compute/docs/instances/windows/connecting-powershell',\n", " 'https://cloud.google.com/compute/docs/instances/windows/creating-managing-windows-instances',\n", " 'https://cloud.google.com/compute/docs/instances/windows/creating-windows-os-image',\n", " 'https://cloud.google.com/compute/docs/instances/windows/creating-windows-persistent-disk-snapshot',\n", " 'https://cloud.google.com/compute/docs/instances/windows/deploying-microsoft-exchange-server-2016-on-compute-engine',\n", " 'https://cloud.google.com/compute/docs/instances/windows/deploying-microsoft-sharepoint-server-on-compute-engine',\n", " 'https://cloud.google.com/compute/docs/instances/windows/generating-credentials',\n", " 'https://cloud.google.com/compute/docs/instances/windows/license-manager',\n", " 'https://cloud.google.com/compute/docs/instances/windows/lima-audit-logging',\n", " 'https://cloud.google.com/compute/docs/instances/windows/ms-licensing',\n", " 'https://cloud.google.com/compute/docs/instances/windows/ms-licensing-faq',\n", " 'https://cloud.google.com/compute/docs/instances/windows/ms-office',\n", " 'https://cloud.google.com/compute/docs/instances/windows/windows-best-practices',\n", " 'https://cloud.google.com/compute/docs/internal-dns',\n", " 'https://cloud.google.com/compute/docs/ip-addresses',\n", " 'https://cloud.google.com/compute/docs/ip-addresses/configure-ipv6-address',\n", " 'https://cloud.google.com/compute/docs/ip-addresses/configure-static-external-ip-address',\n", " 'https://cloud.google.com/compute/docs/ip-addresses/configure-static-internal-ip-address',\n", " 'https://cloud.google.com/compute/docs/labeling-resources',\n", " 'https://cloud.google.com/compute/docs/licenses/about',\n", " 'https://cloud.google.com/compute/docs/licenses/view-append',\n", " 'https://cloud.google.com/compute/docs/load-balancing-and-autoscaling',\n", " 'https://cloud.google.com/compute/docs/load-balancing/optimize-app-latency',\n", " 'https://cloud.google.com/compute/docs/logging/activity-logs',\n", " 'https://cloud.google.com/compute/docs/logging/audit-logging',\n", " 'https://cloud.google.com/compute/docs/logging/migrating-from-activity-logs-to-audit-logs',\n", " 'https://cloud.google.com/compute/docs/logging/usage-export',\n", " 'https://cloud.google.com/compute/docs/machine-images',\n", " 'https://cloud.google.com/compute/docs/machine-images/create-instance-from-machine-image',\n", " 'https://cloud.google.com/compute/docs/machine-images/create-machine-images',\n", " 'https://cloud.google.com/compute/docs/machine-images/import-machine-from-virtual-appliance',\n", " 'https://cloud.google.com/compute/docs/machine-resource',\n", " 'https://cloud.google.com/compute/docs/manage-pmu-in-vms',\n", " 'https://cloud.google.com/compute/docs/memory-optimized-machines',\n", " 'https://cloud.google.com/compute/docs/metadata/getting-live-migration-notice',\n", " 'https://cloud.google.com/compute/docs/metadata/manage-guest-attributes',\n", " 'https://cloud.google.com/compute/docs/metadata/overview',\n", " 'https://cloud.google.com/compute/docs/metadata/predefined-metadata-keys',\n", " 'https://cloud.google.com/compute/docs/metadata/querying-metadata',\n", " 'https://cloud.google.com/compute/docs/metadata/setting-custom-metadata',\n", " 'https://cloud.google.com/compute/docs/monitor-security-risks-console',\n", " 'https://cloud.google.com/compute/docs/naming-resources',\n", " 'https://cloud.google.com/compute/docs/network-bandwidth',\n", " 'https://cloud.google.com/compute/docs/networking/benchmarking-higher-bandwidth-vms',\n", " 'https://cloud.google.com/compute/docs/networking/configure-vm-with-high-bandwidth-configuration',\n", " 'https://cloud.google.com/compute/docs/networking/migrate-to-zonal-dns',\n", " 'https://cloud.google.com/compute/docs/networking/network-overview',\n", " 'https://cloud.google.com/compute/docs/networking/tcp-optimization-for-network-performance-in-gcp-and-hybrid',\n", " 'https://cloud.google.com/compute/docs/networking/use-dpdk',\n", " 'https://cloud.google.com/compute/docs/networking/use-zonal-dns',\n", " 'https://cloud.google.com/compute/docs/networking/using-gvnic',\n", " 'https://cloud.google.com/compute/docs/networking/using-idpf',\n", " 'https://cloud.google.com/compute/docs/networking/using-internal-dns',\n", " 'https://cloud.google.com/compute/docs/networking/zonal-dns',\n", " 'https://cloud.google.com/compute/docs/nodes/about-manual-live-migration',\n", " 'https://cloud.google.com/compute/docs/nodes/autoscaling-node-groups',\n", " 'https://cloud.google.com/compute/docs/nodes/bringing-your-own-licenses',\n", " 'https://cloud.google.com/compute/docs/nodes/determining-server-usage',\n", " 'https://cloud.google.com/compute/docs/nodes/manually-live-migrate',\n", " 'https://cloud.google.com/compute/docs/nodes/overcommitting-cpus-sole-tenant-vms',\n", " 'https://cloud.google.com/compute/docs/nodes/provisioning-sole-tenant-vms',\n", " 'https://cloud.google.com/compute/docs/nodes/share-node-groups',\n", " 'https://cloud.google.com/compute/docs/nodes/sole-tenancy-accounting-faq',\n", " 'https://cloud.google.com/compute/docs/nodes/sole-tenancy-advanced-maintenance-control',\n", " 'https://cloud.google.com/compute/docs/nodes/sole-tenant-best-practices',\n", " 'https://cloud.google.com/compute/docs/nodes/sole-tenant-nodes',\n", " 'https://cloud.google.com/compute/docs/nodes/updating-vm-tenancy',\n", " 'https://cloud.google.com/compute/docs/oslogin',\n", " 'https://cloud.google.com/compute/docs/oslogin/manage-oslogin-in-an-org',\n", " 'https://cloud.google.com/compute/docs/oslogin/security-keys',\n", " 'https://cloud.google.com/compute/docs/oslogin/set-up-oslogin',\n", " 'https://cloud.google.com/compute/docs/oslogin/view-audit-logs',\n", " 'https://cloud.google.com/compute/docs/overview',\n", " 'https://cloud.google.com/compute/docs/pmu-overview',\n", " 'https://cloud.google.com/compute/docs/quickstart-mig',\n", " 'https://cloud.google.com/compute/docs/redis/deployment-options',\n", " 'https://cloud.google.com/compute/docs/regions-zones',\n", " 'https://cloud.google.com/compute/docs/regions-zones/changing-default-zone-region',\n", " 'https://cloud.google.com/compute/docs/regions-zones/global-regional-zonal-resources',\n", " 'https://cloud.google.com/compute/docs/regions-zones/viewing-regions-zones',\n", " 'https://cloud.google.com/compute/docs/resources',\n", " 'https://cloud.google.com/compute/docs/samples',\n", " 'https://cloud.google.com/compute/docs/shutdownscript',\n", " 'https://cloud.google.com/compute/docs/storage-optimized-machines',\n", " 'https://cloud.google.com/compute/docs/sustained-use-discounts',\n", " 'https://cloud.google.com/compute/docs/tag-resources',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/automatic-commitment-renewal',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/capturing-vm-screenshots',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/collecting-core-dumps',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/collecting-diagnostic-information',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/fstab-errors',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/general-tips',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/gvnic',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/import-migrate',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/kernel-panic',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/rescue-vm',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshoot-future-reservations',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshoot-metadata-server',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshoot-operation-limits',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshoot-os-login',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-arm-vms',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-bulk-vm-creation',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-cpu-soft-lockup',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-default-service-accounts',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-disk-full-resize',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-disk-nvme',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-gpus',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-import-export-images',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-instant-snapshots',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-migs',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-nested-vms',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-networking',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-performance',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-rdp',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-reboots',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-reservation-consumption',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-reservation-creation',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-reservation-monitoring',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-reservation-updates',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-resource-availability',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-snapshots',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-sole-tenancy',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-ssh-errors',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-sudoers-file',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-suse-registration',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-suspend-resume',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-ubuntu-pro-registration',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-using-serial-console',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-vm-creation',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-windows',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-workload-to-workload-auth',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/viewing-serial-port-output',\n", " 'https://cloud.google.com/compute/docs/troubleshooting/vm-startup',\n", " 'https://cloud.google.com/compute/docs/tutorials/basic-webserver-apache',\n", " 'https://cloud.google.com/compute/docs/tutorials/basic-webserver-iis',\n", " 'https://cloud.google.com/compute/docs/tutorials/creating-high-performance-sql-server-instance',\n", " 'https://cloud.google.com/compute/docs/tutorials/creating-sql-server-instance-using-netapp',\n", " 'https://cloud.google.com/compute/docs/tutorials/deploy-aspnet-app',\n", " 'https://cloud.google.com/compute/docs/tutorials/globally-autoscaling-a-web-service-on-compute-engine',\n", " 'https://cloud.google.com/compute/docs/tutorials/high-availability-autohealing',\n", " 'https://cloud.google.com/compute/docs/tutorials/high-availability-linux-pacemaker',\n", " 'https://cloud.google.com/compute/docs/tutorials/high-availability-load-balancing',\n", " 'https://cloud.google.com/compute/docs/tutorials/high-scalability-autoscaling',\n", " 'https://cloud.google.com/compute/docs/tutorials/http-load-balancing-iis',\n", " 'https://cloud.google.com/compute/docs/tutorials/load-testing-sql-server-hammerdb',\n", " 'https://cloud.google.com/compute/docs/tutorials/migrate-workload-to-stateful-mig',\n", " 'https://cloud.google.com/compute/docs/tutorials/migrating-aws-sql-server-to-compute-engine',\n", " 'https://cloud.google.com/compute/docs/tutorials/ml-inference-t4',\n", " 'https://cloud.google.com/compute/docs/tutorials/performing-an-automated-in-place-upgrade-windows-server',\n", " 'https://cloud.google.com/compute/docs/tutorials/performing-in-place-upgrade-windows-server',\n", " 'https://cloud.google.com/compute/docs/tutorials/robustsystems',\n", " 'https://cloud.google.com/compute/docs/tutorials/running-windows-server-failover-clustering',\n", " 'https://cloud.google.com/compute/docs/tutorials/sending-mail',\n", " 'https://cloud.google.com/compute/docs/tutorials/sending-mail/using-mailgun',\n", " 'https://cloud.google.com/compute/docs/tutorials/sending-mail/using-mailjet',\n", " 'https://cloud.google.com/compute/docs/tutorials/sending-mail/using-sendgrid',\n", " 'https://cloud.google.com/compute/docs/tutorials/service-account-ssh',\n", " 'https://cloud.google.com/compute/docs/tutorials/setup-active-directory',\n", " 'https://cloud.google.com/compute/docs/viewing-and-applying-idle-resources-recommendations',\n", " 'https://cloud.google.com/compute/docs/virtual-workstation',\n", " 'https://cloud.google.com/compute/docs/virtual-workstation/linux',\n", " 'https://cloud.google.com/compute/docs/virtual-workstation/linux-gpu',\n", " 'https://cloud.google.com/compute/docs/virtual-workstation/windows',\n", " 'https://cloud.google.com/compute/docs/virtual-workstation/windows-gpu',\n", " 'https://cloud.google.com/compute/docs/vm-manager',\n", " 'https://cloud.google.com/docs',\n", " 'https://cloud.google.com/docs/access-resources',\n", " 'https://cloud.google.com/docs/ai-ml',\n", " 'https://cloud.google.com/docs/application-development',\n", " 'https://cloud.google.com/docs/application-hosting',\n", " 'https://cloud.google.com/docs/compute-area',\n", " 'https://cloud.google.com/docs/costs-usage',\n", " 'https://cloud.google.com/docs/cross-product-overviews',\n", " 'https://cloud.google.com/docs/data',\n", " 'https://cloud.google.com/docs/databases',\n", " 'https://cloud.google.com/docs/devtools',\n", " 'https://cloud.google.com/docs/dhm-cloud',\n", " 'https://cloud.google.com/docs/generative-ai',\n", " 'https://cloud.google.com/docs/iac',\n", " 'https://cloud.google.com/docs/industry',\n", " 'https://cloud.google.com/docs/migration',\n", " 'https://cloud.google.com/docs/networking',\n", " 'https://cloud.google.com/docs/observability',\n", " 'https://cloud.google.com/docs/security',\n", " 'https://cloud.google.com/docs/storage',\n", " 'https://cloud.google.com/docs/tech-area-overviews',\n", " 'https://cloud.google.com/docs/terraform/get-started-with-terraform',\n", " 'https://cloud.google.com/load-balancing/docs/https/setting-up-https',\n", " 'https://cloud.google.com/load-balancing/docs/internal/setting-up-internal',\n", " 'https://cloud.google.com/marketplace/docs'}" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "links_on_page" ] }, { "cell_type": "code", "execution_count": 16, "id": "6d1987db-b346-41cb-adcb-1a4ba0f6fd03", "metadata": {}, "outputs": [], "source": [ "article_section = soup.find('article', class_='devsite-article')\n", "links_in_article = article_section.find_all('a', href=True)" ] }, { "cell_type": "code", "execution_count": 17, "id": "2b48bcf0-dd19-4378-83e0-6526eea688e7", "metadata": {}, "outputs": [], "source": [ "def make_google_cloud_link(link):\n", " return 'https://cloud.google.com{}'.format(link['href'])" ] }, { "cell_type": "code", "execution_count": 18, "id": "20d62b32-bac1-49d6-96ae-86143fcaa3bd", "metadata": {}, "outputs": [], "source": [ "article_links = set()\n", "for lia in links_in_article:\n", " if lia and 'docs' in lia['href'] and '#' not in lia['href']:\n", " article_links.add(make_google_cloud_link(lia))" ] }, { "cell_type": "code", "execution_count": 19, "id": "bad4726e-394a-4935-a57f-f53fe8f87ae6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'https://cloud.google.com/apis/docs/cloud-client-libraries',\n", " 'https://cloud.google.com/compute/docs/choose-compute-deployment-option',\n", " 'https://cloud.google.com/compute/docs/cpu-platforms',\n", " 'https://cloud.google.com/compute/docs/disks',\n", " 'https://cloud.google.com/compute/docs/gpus',\n", " 'https://cloud.google.com/compute/docs/machine-resource',\n", " 'https://cloud.google.com/compute/docs/networking/network-overview',\n", " 'https://cloud.google.com/compute/docs/regions-zones',\n", " 'https://cloud.google.comhttps://cloud.google.com/compute/docs',\n", " 'https://cloud.google.comhttps://cloud.google.com/compute/docs/overview'}" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "article_links" ] }, { "cell_type": "code", "execution_count": null, "id": "98477112-90f6-4ddd-96e9-dfc5e8f5ff82", "metadata": {}, "outputs": [], "source": [ "# i = 0\n", "# for elem in article_section:\n", "# if i < 5:\n", " \n", "# if elem.name in exclude_tags:\n", "# continue\n", "\n", "# print('** {} **: {}'.format(i,elem))\n", "# if isinstance(elem, Tag):\n", "# keys = elem.attrs.keys()\n", "# print(keys)\n", "# if 'class' in keys:\n", "# print(\"---*** TAG NAME: {}\".format(elem.name))\n", "# print(elem['class'])\n", "# class_list = elem['class']\n", "# print(\"CLASS_LIST: {}\".format(class_list))\n", "# for cl in class_list:\n", "# print(\"CLASS cl: {}\".format(cl))\n", "# if 'breadcrumb' in cl or 'meta' in cl:\n", "# print('DECOMPOSING\\n')\n", "# elem.decompose()\n", "# break\n", "# else:\n", "# print('No class or no breadcrumb')\n", "# i = i + 1\n", "# else:\n", "# continue\n", "# else:\n", "# article_section = article_section\n", "# break" ] }, { "cell_type": "code", "execution_count": null, "id": "849ab8d6-3f38-46a7-bbe8-5341f070861a", "metadata": {}, "outputs": [], "source": [ "# article_section" ] }, { "cell_type": "code", "execution_count": 21, "id": "dceddf77-03a8-46d8-b569-929b1115b35d", "metadata": {}, "outputs": [], "source": [ "soupy = eventarc.soup" ] }, { "cell_type": "code", "execution_count": 22, "id": "1445ba84-7e53-4612-8a31-2c60355913ab", "metadata": {}, "outputs": [], "source": [ "art_body = soupy.select('.devsite-article-body')" ] }, { "cell_type": "code", "execution_count": 23, "id": "3a2263cb-694d-490c-8fd3-57a53e8dabfc", "metadata": {}, "outputs": [], "source": [ "content = \"\"\n", "for ab in art_body:\n", " a_tags = ab.find_all('a')\n", " for a_tag in a_tags:\n", " a_tag.decompose()\n", " content += ab.get_text(separator=\"\\n\").strip()" ] }, { "cell_type": "code", "execution_count": null, "id": "ff87addb-f13c-4884-957b-fbffe47b2d4e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"Compute Engine is an infrastructure as a service (IaaS) product that offers\\nself-managed virtual machine (VM) instances and bare\\nmetal instances. Compute Engine offers VMs with a KVM hypervisor,\\noperating systems for both Linux and Windows, and local and durable\\nstorage options. You can configure and control Compute Engine\\nresources using the Google Cloud console, the Google Cloud CLI, or using a\\nREST-based API. You can also use a variety of programming languages available\\nwith Google's\\n\\n.\\n\\n\\nHere are some of the benefits of using Compute Engine:\\n\\n\\n\\n\\nExtensibility:\\n Compute Engine integrates with Google Cloud\\ntechnologies such as Cloud Storage, Google Kubernetes Engine, and\\nBigQuery, to extend beyond the basic computational capability to\\ncreate more complex and sophisticated applications.\\n\\n\\nScalability:\\n Scale the number of compute resources as needed without\\nhaving to manage your own infrastructure. This is useful for businesses that\\nexperience sudden increases in traffic, because you can quickly add more\\ninstances to handle the increase and remove the instances after they are no\\nlonger needed.\\n\\n\\nReliability:\\n Google's infrastructure is highly reliable, with a 99.9%\\nuptime guarantee.\\n\\n\\nCost-effectiveness:\\n Compute Engine offers a variety of pricing\\noptions to fit your budget. Also, you only pay for the resources that you use,\\nand there are no up-front costs.\\n\\n\\n\\n\\nWhat Compute Engine provides\\n\\n\\nCompute Engine provides flexibility so that you can run a wide-range\\nof applications and workloads that support your needs. From batch processing\\nto webserving or high performance computing you can configure\\nCompute Engine to meet your needs.\\n\\n\\nLocation selection\\n\\n\\nGoogle offers worldwide regions for you to deploy Compute Engine\\nresources. You can choose a region that best fits the requirements of your\\nworkload:\\n\\n\\n\\n\\nRegion-specific restrictions\\n\\n\\nUser latency by region\\n\\n\\nLatency requirements of your application\\n\\n\\nAmount of control over latency\\n\\n\\nBalance between low latency and simplicity\\n\\n\\n\\n\\nFor more information about regions and zones, see\\n\\n.\\n\\n\\nCompute Engine machine types\\n\\n\\nCompute Engine provides a comprehensive set of machine families, each\\ncontaining machine types to choose from when you create a compute instance. Each\\nmachine family is comprised of machine series and predefined machine types\\nwithin each series.\\n\\n\\nCompute Engine offers general-purpose, compute-optimized,\\nstorage-optimized, memory-optimized, and accelerator-optimized machine\\nfamilies. If a preconfigured, general-purpose machine type doesn't meet your\\nneeds, then you can create a custom machine type with customized CPU and memory\\nresources for some of the machine series.\\n\\n\\nFor more information, see the\\n\\n.\\n\\n\\nOperating systems\\n\\n\\nCompute Engine provides many preconfigured public operating system\\nimages for both Linux and Windows. Most public images are provided for no\\nadditional cost, but there are some\\n\\n for which you are\\nbilled. You are not billed for importing custom images, but you will incur an\\n\\n while you keep\\nthe custom image in your project.\\n\\n\\nStorage options\\n\\n\\nYou can choose from several block storage options, including Persistent Disk,\\nGoogle Cloud Hyperdisk, and Local SSD:\\n\\n\\n\\n\\nPersistent Disk:\\n High-performance and redundant network storage. Each\\nvolume is striped across hundreds of physical disks.\\n\\n\\nHyperdisk:\\n The fastest redundant network storage for\\nCompute Engine, with configurable performance and volumes that can be\\nresized dynamically. Each volume is striped across hundreds of physical disks.\\nYou can also reduce costs and disk management complexity by purchasing\\ncapacity and performance in advance with Hyperdisk Storage Pools. Hyperdisk Storage Pools provide\\nan aggregate amount of capacity and performance that you can share among the\\ndisks created in the pool.\\n\\n\\nLocal SSD:\\n Physical drives that are attached directly to the same\\nserver as a compute instance. They offer better performance, but are not\\ndurable. If the instance is shut down, then the Local SSD disks are deleted.\\n\\n\\n\\n\\nEach option has unique price and performance. For cost comparisons, see\\n\\n. For more information about\\ndisk types, see \\n.\\n\\n\\nWhat's next\\n\\n\\n\\n\\nSee the \\n and\\n\\n that are available for your use.\\n\\n\\nRead an \\n.\\n\\n\\nLearn about the various \\n.\"" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# content" ] }, { "cell_type": "code", "execution_count": 25, "id": "3b59e884-7946-4b6c-b768-8d585d0a9bab", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Compute Engine is an infrastructure as a service (IaaS) product that offers\n", "self-managed virtual machine (VM) instances and bare\n", "metal instances. Compute Engine offers VMs with a KVM hypervisor,\n", "operating systems for both Linux and Windows, and local and durable\n", "storage options. You can configure and control Compute Engine\n", "resources using the Google Cloud console, the Google Cloud CLI, or using a\n", "REST-based API. You can also use a variety of programming languages available\n", "with Google's\n", "\n", ".\n", "\n", "\n", "Here are some of the benefits of using Compute Engine:\n", "\n", "\n", "\n", "\n", "Extensibility:\n", " Compute Engine integrates with Google Cloud\n", "technologies such as Cloud Storage, Google Kubernetes Engine, and\n", "BigQuery, to extend beyond the basic computational capability to\n", "create more complex and sophisticated applications.\n", "\n", "\n", "Scalability:\n", " Scale the number of compute resources as needed without\n", "having to manage your own infrastructure. This is useful for businesses that\n", "experience sudden increases in traffic, because you can quickly add more\n", "instances to handle the increase and remove the instances after they are no\n", "longer needed.\n", "\n", "\n", "Reliability:\n", " Google's infrastructure is highly reliable, with a 99.9%\n", "uptime guarantee.\n", "\n", "\n", "Cost-effectiveness:\n", " Compute Engine offers a variety of pricing\n", "options to fit your budget. Also, you only pay for the resources that you use,\n", "and there are no up-front costs.\n", "\n", "\n", "\n", "\n", "What Compute Engine provides\n", "\n", "\n", "Compute Engine provides flexibility so that you can run a wide-range\n", "of applications and workloads that support your needs. From batch processing\n", "to webserving or high performance computing you can configure\n", "Compute Engine to meet your needs.\n", "\n", "\n", "Location selection\n", "\n", "\n", "Google offers worldwide regions for you to deploy Compute Engine\n", "resources. You can choose a region that best fits the requirements of your\n", "workload:\n", "\n", "\n", "\n", "\n", "Region-specific restrictions\n", "\n", "\n", "User latency by region\n", "\n", "\n", "Latency requirements of your application\n", "\n", "\n", "Amount of control over latency\n", "\n", "\n", "Balance between low latency and simplicity\n", "\n", "\n", "\n", "\n", "For more information about regions and zones, see\n", "\n", ".\n", "\n", "\n", "Compute Engine machine types\n", "\n", "\n", "Compute Engine provides a comprehensive set of machine families, each\n", "containing machine types to choose from when you create a compute instance. Each\n", "machine family is comprised of machine series and predefined machine types\n", "within each series.\n", "\n", "\n", "Compute Engine offers general-purpose, compute-optimized,\n", "storage-optimized, memory-optimized, and accelerator-optimized machine\n", "families. If a preconfigured, general-purpose machine type doesn't meet your\n", "needs, then you can create a custom machine type with customized CPU and memory\n", "resources for some of the machine series.\n", "\n", "\n", "For more information, see the\n", "\n", ".\n", "\n", "\n", "Operating systems\n", "\n", "\n", "Compute Engine provides many preconfigured public operating system\n", "images for both Linux and Windows. Most public images are provided for no\n", "additional cost, but there are some\n", "\n", " for which you are\n", "billed. You are not billed for importing custom images, but you will incur an\n", "\n", " while you keep\n", "the custom image in your project.\n", "\n", "\n", "Storage options\n", "\n", "\n", "You can choose from several block storage options, including Persistent Disk,\n", "Google Cloud Hyperdisk, and Local SSD:\n", "\n", "\n", "\n", "\n", "Persistent Disk:\n", " High-performance and redundant network storage. Each\n", "volume is striped across hundreds of physical disks.\n", "\n", "\n", "Hyperdisk:\n", " The fastest redundant network storage for\n", "Compute Engine, with configurable performance and volumes that can be\n", "resized dynamically. Each volume is striped across hundreds of physical disks.\n", "You can also reduce costs and disk management complexity by purchasing\n", "capacity and performance in advance with Hyperdisk Storage Pools. Hyperdisk Storage Pools provide\n", "an aggregate amount of capacity and performance that you can share among the\n", "disks created in the pool.\n", "\n", "\n", "Local SSD:\n", " Physical drives that are attached directly to the same\n", "server as a compute instance. They offer better performance, but are not\n", "durable. If the instance is shut down, then the Local SSD disks are deleted.\n", "\n", "\n", "\n", "\n", "Each option has unique price and performance. For cost comparisons, see\n", "\n", ". For more information about\n", "disk types, see \n", ".\n", "\n", "\n", "What's next\n", "\n", "\n", "\n", "\n", "See the \n", " and\n", "\n", " that are available for your use.\n", "\n", "\n", "Read an \n", ".\n", "\n", "\n", "Learn about the various \n", ".\n" ] } ], "source": [ "print(content)" ] }, { "cell_type": "code", "execution_count": null, "id": "2c49a47c-f5cb-42b1-a1fc-32b888886075", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "venv", "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.17" } }, "nbformat": 4, "nbformat_minor": 5 }