import urllib, htmllib, formatter
url = 'https://example.com'
data = urllib.urlopen(url).read()
formatter_obj = formatter.AbstractFormatter(formatter.NullWriter())
parser = htmllib.HTMLParser(formatter_obj)
parser.feed(data)
for link in parser.anchorlist:
print(link)
from html.parser import HTMLParser
from urllib.request import urlopen
class LinkExtractor(HTMLParser):
def __init__(self):
super().__init__()
self.links = []
def handle_starttag(self, tag, attrs):
if tag == 'a':
for k, v in attrs:
if k == 'href':
self.links.append(v)
parser = LinkExtractor()
parser.feed(urlopen('https://example.com').read().decode())
for link in parser.links:
print(link)
import requests
from bs4 import BeautifulSoup
resp = requests.get('https://example.com', timeout=10)
resp.raise_for_status()
soup = BeautifulSoup(resp.text, 'html.parser')
# 絕對化 URL
from urllib.parse import urljoin
base = resp.url
for a in soup.find_all('a', href=True):
print(urljoin(base, a['href']))
import asyncio, aiohttp
from bs4 import BeautifulSoup
from urllib.parse import urljoin, urlparse
async def fetch_links(session, url):
async with session.get(url) as resp:
html = await resp.text()
soup = BeautifulSoup(html, 'html.parser')
base = str(resp.url)
domain = urlparse(base).netloc
links = set()
for a in soup.find_all('a', href=True):
full = urljoin(base, a['href'])
if urlparse(full).netloc == domain:
links.add(full)
return links
學習 htmllib 了解歷史演進,實際項目請直接使用 BeautifulSoup + requests/aiohttp,開發效率與穩健性最佳。