#!/usr/bin/env python3 # -*- coding: utf-8 -*- from urllib.request import build_opener, HTTPCookieProcessor, HTTPSHandler, Request from urllib.error import URLError, HTTPError from os.path import relpath from collections import deque import sys from time import sleep import ssl from io import BytesIO, StringIO import json import re try: from bs4 import BeautifulSoup import html5lib import certifi except ImportError: print("Please install the BeautifulSoup, html5lib, and certifi libraries using `pip install bs4 html5lib certifi`.\n") raise if [int(v) for v in certifi.__version__.split('.')] < [2021, 5, 30]: print("Please upgrade certifi using `pip install --upgrade certifi`.\n") sys.exit(1) GITHUB_LINE_FRAGMENT = re.compile('L[0-9]+') def get_links_and_destinations_from_pdf(f): try: from PyPDF2 import PdfFileReader except ImportError: print("Please install the PyPDF2 library using `pip install PyPDF2`.\n") raise # Based on pdf = PdfFileReader(f) links = set() for pg in range(pdf.getNumPages()): obj = pdf.getPage(pg).getObject() for annotation in obj.get('/Annots', []): uri = annotation.getObject().get('/A', {}).get('/URI', None) if uri is not None and uri not in links: links.add(uri) dests = pdf.getNamedDestinations().keys() return (links, dests) def get_links_and_destinations_from_html(f): links = set() internal = set() dests = set() soup = BeautifulSoup(f.read(), "html5lib") # First try to find this: