首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python 解析網頁超鏈接:htmllib 歷史實現與現代最佳實踐

     編輯:更多程式設計知識

舊版 htmllib 實現(Python 2)


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)

現代標準庫方案:html.parser


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)

生產級方案:BeautifulSoup + requests


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,開發效率與穩健性最佳。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved